码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • cf1695D1. Tree Queries (Easy Version)(div2)【树上问题】


    传送门

    题意

    给定一棵树,并在树上任选一个节点 x x x (未知),每次都可以询问树上另一指定结点 v v v 到 x x x 的最短路径,问最少需要几次询问,使得不论 x x x 是哪一个结点,都可以在询问次数及之内确认该点。

    脑模可以发现,如果树的形状是一条链,可以仅通过询问一次叶子结点确认。不属于该结构的第一个例子是拥有 4 4 4 个结点的菊花图,假设以结点 2 2 2 为菊花中心,则确认其他三个结点中的任意一个都需要经历: 1. 1. 1.确定该点不是菊花中心 2. 2. 2.确定该点 两次询问。

    此时若以 2 2 2 为根,则结点 1 , 3 , 4 1,3,4 1,3,4 均构成单独的链,可以发现增长 ( 如添加 ( 4 , 5 ) (4,5) (4,5) )其中的某条链不影响答案贡献。若在该基础上再增加 ( 4 , 6 ) (4,6) (4,6) ,由于子链的个数将增多,以 2 2 2 为根的答案为 3 3 3,但改变作为根的结点时,将影响树中的子链个数从而影响答案,使最优答案仍为 2 2 2 。

    因此将所有点作为根的情况都跑一遍 d f s dfs dfs , l i n k link link 为当前结点直接相连的子链个数,由此向上传递答案贡献值。

    #include <bits/stdc++.h>
    #define int long long
    #define endl "\n"
    using namespace std;
    
    const int N=2e5+10;
    vector<int> g[N];
    
    int dfs(int u,int fa){
        int cnt=0,link=0;
        for(auto v:g[u]) {
            if(v==fa) 
                continue;
            int x=dfs(v,u) ;
            if(!x)
                link++;
            cnt+=x;
        }
        cnt+=max((long long)0,link-1);
        // cout<<u<<" "<<cnt<<" "<<link<<endl;
        return cnt;
    }
    
    void solve() {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++) 
            g[i].clear();
        for(int i=1;i<n;i++){
            int u,v;
            cin>>u>>v;
            g[u].push_back(v) ;
            g[v].push_back(u) ;
        }
        int ans=n-1;
        for(int i=1;i<=n;i++){
            ans=min(ans,dfs(i,0)+1);
        }
        cout<<ans<< endl;
    }
    
    signed main(){
        ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
        int t=1; 
        cin>>t;
        while(t--) 
            solve();
        return 0 ;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
  • 相关阅读:
    九州云亮相算网融合产业发展峰会,5G MEC赋能产业发展
    软件架构设计与需求分析方法论
    从零备战蓝桥杯——Trie 字典树(前缀树)
    《乔布斯传》英文原著重点词汇笔记(八)【 chapter six 】
    tp6 小程序码生成(带参数)
    为知笔记一个日记模板
    【论文阅读】AttnDreamBooth | 面向文本对齐的个性化图片生成
    微服务网关 —— SpringCloud Gateway
    ROS机械臂 Movelt 学习笔记2 | Move Group 接口 C++
    00后测试员摸爬滚打近一年,为是否要转行或去学软件测试的学弟们总结出了以下走心建议
  • 原文地址:https://blog.csdn.net/laysan/article/details/125481571
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号