码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 846. 树的重心


    输入样例
    1. 9
    2. 1 2
    3. 1 7
    4. 1 4
    5. 2 8
    6. 2 5
    7. 4 3
    8. 3 9
    9. 4 6
    输出样例:
    4

    分析:因为有n-1条边,所以每个点必然会连接到其他点,不存在孤立点,因此,我们从1-n任意点开始dfs都是可以的,因为无论怎么样,每个点都必然会被遍历。

    我的思路:假设一个结点被删除,那么会出现三块连通块,分别是该点的左子树,右子树,和其他。然而要求左子树和右子树的节点数有点困难,因此我的思路是错误的。

    但求左右子树的总节点数是可以的

    因此插入一个极其重要的知识点:dfs遍历树,是可以知道其子树的节点数的

    如正确答案所示,这里的dfs并不是像其他题一样,为了找答案而遍历,找到答案就return。

    而是在遍历的过程中不断找最优答案,很多树上dfs都是这样。

    然后还有一点疑惑,int s = dfs(x);  res = max(res, s); res = max(res, n - sum);

    比如当前cur为4。那s是以4为根结点的树的节点数,n-sum是其余树,为啥要这样比较?如果这样的话是在删哪一个结点?这哪里有删的动作啊?按照我的理解,应该是当前删cur呀

    算法写的很像在删除cur,实则不然。

    res = max(res, s)是在跟以4为根节点的树作比较,可以假装这时候是在删1

    而res = max(res, n - sum)是在跟其余树作比较,可以假装这时候在删4

    很难想到

    但代码总归能遍历到所有情况

    1. int n, vis[N], ans = inf;
    2. vectorint>> v(1e5 + 10);
    3. int dfs(int cur) {
    4. //以cur为根,与左右子树的节点个数(包括cur)
    5. vis[cur] = 1;
    6. int sum = 1, res = 0;
    7. for (auto x : v[cur]) {
    8. if (!vis[x]) {
    9. int s = dfs(x);
    10. sum += s;
    11. res = max(res, s);
    12. }
    13. }
    14. res = max(res, n - sum);
    15. ans = min(ans, res);
    16. return sum;
    17. }
    18. signed main() {
    19. cin >> n;
    20. for (int i = 1; i < n; i++) {
    21. int a, b; cin >> a >> b;
    22. v[a].push_back(b);
    23. v[b].push_back(a);
    24. }
    25. dfs(1);
    26. cout << ans;
    27. return 0;
    28. }

     

  • 相关阅读:
    Watermelon Book(二)线性模型
    谈谈什么是数据质量管理
    模拟相册图片切换
    期末前端web大作业:餐饮美食网站设计与实现——美食菜品网页(16页)
    ​有哪些比较好的录制游戏视频软件​,游戏录屏软件哪个好用
    Hadoop3:MapReduce中实现自定义排序
    【Java每日一题】— —第三十一题:银行账号管理程序设计(2023.10.15)
    [CSS入门到进阶] 你真的了解 width height 吗?
    Java IO流
    asp.net网上销售系统VS开发mysql数据库web结构c#编程Microsoft Visual Studio计算机毕业设计
  • 原文地址:https://blog.csdn.net/clmm_/article/details/133915164
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号