首先把无向图变成一棵树,直径肯定由叶子组成

有以下两种情况

第一种经过根节点,则找两个最远的叶子肯定是直径,也就是B+D。

第二种不经过根节点,则目标的两个叶子肯定有一个不为根的公共祖先,如红点O,则在红点O下面找两个最远的叶子作为直径,找到了C+F。而很明显,这两个目标叶子中的其中一个(F)是距离根最远的叶子,因为如果两个叶子中不包含离根最远的点,则F经过根节点会找到更长的直径,矛盾。

树的直径必然包括一个最远(深)叶子。先搜索到这个点(F),然后再搜索一次最远的点,可以得到树的直径。

这也说明,若把每个点(X)当成一个根,则直径的两个点(C+F)中的一个为X的最远点 ,所以找到直径C+F,则可以找到每个点在无向图中的最远距离:disCX or disFX

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cstdlib>
  6. #include<vector>
  7. using namespace std;
  8. int dis[],ans[];
  9. int n,s,t;
  10. vector<int>G[];
  11. vector<int>L[];
  12. void _dfs(int v)
  13. {
  14. for(int i=;i<G[v].size();i++){
  15. if(!dis[G[v][i]]) {
  16. dis[G[v][i]]=dis[v]+L[v][i];
  17. _dfs(G[v][i]);
  18. }//任意两个点只有一条路,所以dfs和bfs效果一样
  19. }
  20. }
  21. void _finds()
  22. {
  23. memset(dis,,sizeof(dis));
  24. dis[]=;_dfs();s=;
  25. for(int i=;i<=n;i++)
  26. if(dis[i]>dis[s]) s=i;
  27.  
  28. }
  29. void _findt()
  30. {
  31. memset(dis,,sizeof(dis));
  32. dis[s]=;_dfs(s);t=;
  33. for(int i=;i<=n;i++)
  34. if(dis[i]>dis[t]) t=i;
  35. for(int i=;i<=n;i++) ans[i]=dis[i]-;
  36. }
  37. void _tdis()
  38. {
  39. memset(dis,,sizeof(dis));
  40. dis[t]=;
  41. _dfs(t);
  42. for(int i=;i<=n;i++)
  43. if(dis[i]->ans[i]) ans[i]=dis[i]-;
  44. }
  45. int main()
  46. {
  47. int i,j,k,u,v;
  48. while(~scanf("%d",&n)){
  49. for(i=;i<=n;i++) {
  50. G[i].clear();
  51. L[i].clear();
  52. }
  53. for(i=;i<=n;i++){
  54. scanf("%d%d",&u,&v);
  55. G[u].push_back(i);
  56. L[u].push_back(v);
  57. G[i].push_back(u);
  58. L[i].push_back(v);
  59. }
  60. _finds();
  61. _findt();
  62. _tdis();
  63. for(i=;i<=n;i++)
  64. printf("%d\n",ans[i]);
  65. }
  66. return ;
  67. }

树的直径证明+HDU2196的更多相关文章

  1. 「树的直径」BFS方法证明

    选定任意一个点u,从u开始BFS求出距离u最大的点s,再从s点出发BFS到距离s最大的点t,则dis(s,t)即为树的直径 证明 其实只要找到了树的直径的一个端点,再BFS找到最远点就一定是直径的另一 ...

  2. 树的直径的求法即相关证明【树形DP || DFS】

    学习大佬:树的直径求法及证明 树的直径 定义: 一棵树的直径就是这棵树上存在的最长路径. 给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和.树中最远的两个节点之间的距 ...

  3. hdu2196 树的直径 + bfs

    //Accepted 740 KB 15 ms //树的直径 //距离一个顶点最远的点一定是树的直径的一个端点 #include <cstdio> #include <cstring ...

  4. poj2631 求树的直径裸题

    题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...

  5. [USACO2004][poj1985]Cow Marathon(2次bfs求树的直径)

    http://poj.org/problem?id=1985 题意:就是给你一颗树,求树的直径(即问哪两点之间的距离最长) 分析: 1.树形dp:只要考虑根节点和子节点的关系就可以了 2.两次bfs: ...

  6. BZOJ 2282 & 树的直径

    SDOI2011的Dayx第2题 题意: 在树中找到一条权值和不超过S的链(为什么是链呢,因为题目中提到“使得路径的两端都是城市”,如果不是链那不就不止两端了吗——怎么这么机智的感觉...),使得不在 ...

  7. HDU 4123(树的直径+单调队列)

    Bob’s Race Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. CF 120F Spider 树的直径 简单题

    一个男孩有n只玩具蜘蛛,每只蜘蛛都是一个树的结构,现在男孩准备把这n只小蜘蛛通过粘贴节点接在一起,形成一只大的蜘蛛.大的蜘蛛也依然是树的结构.输出大的蜘蛛的直径. 知识: 树的直径是指树上的最长简单路 ...

  9. POJ 1985 Cow Marathon && POJ 1849 Two(树的直径)

    树的直径:树上的最长简单路径. 求解的方法是bfs或者dfs.先找任意一点,bfs或者dfs找出离他最远的那个点,那么这个点一定是该树直径的一个端点,记录下该端点,继续bfs或者dfs出来离他最远的一 ...

随机推荐

  1. samba安装测试

    1.检查是否系统有自带的samba安装包 2.关闭防火墙 Iptables -F Systemctl disable firewalld Systemctl stop firewalld System ...

  2. char *strstr(const char *str1, const char *str2);

    [FROM MSDN && 百科] 原型:char *strstr(const char *str1, const char *str2); #include<string.h& ...

  3. NodeJS学习笔记四

    Generator简介 基本概念 Generator函数有多种理解角度.从语法上,首先可以把它理解成,Generator函数是一个状态机,封装了多个内部状态. 执行Generator函数会返回一个遍历 ...

  4. VS2010/MFC编程入门之十九(对话框:颜色对话框)

    鸡啄米在上一节中为大家讲解了字体对话框的使用方法,熟悉了字体对话框,本节继续讲另一种通用对话框--颜色对话框. 颜色对话框大家肯定也不陌生,我们可以打开它选择需要的颜色,简单说,它的作用就是用来选择颜 ...

  5. G.Finding the Radius for an Inserted Circle 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛

    地址:https://nanti.jisuanke.com/t/17314 题目: Three circles C_{a}C​a​​, C_{b}C​b​​, and C_{c}C​c​​, all ...

  6. Buffer flip()方法

    英文API:Flips this buffer. The limit is set to the current position and then the position is set to ze ...

  7. Python3.6(windows系统)通过pip安装bs4

    Python3.6(windows系统)通过pip安装bs4 cmd安装命令: pip install beautifulsoup4 执行结果:

  8. mybatis的namespace

    Mybatis的namespace是用来绑定Dao接口的,使用了namespace之后就可以不用写接口实现类,dao接口的方法对应mapper.xml中的sql语句. 详情见:https://blog ...

  9. 我是如何通过debug成功甩锅浏览器的:解决fixed定位元素,在页面滚动后touch事件失效问题

    如果你关注我应该知道,我最近对PC端页面进行移动适配.在这个过程中,为了节省用户300ms的时间,同时给予用户更及时的点击反馈(这意味着更好的用户体验),我在尝试使用移动端独有的 touchstart ...

  10. ubuntu 16.04下更换源和pip源【转】

    本文转载自:https://blog.csdn.net/weixin_41500849/article/details/80246221 写在前面的话 本文主要内容是更换系统源为清华大学源,更换pyt ...