tyvj:1520 树的直径

Time Limit: 1 Sec  Memory Limit: 131072KiB
Submit: 9619  Solved: 3287

题目连接

http://www.tyvj.cn/p/1520

Description

树的直径,即这棵树中距离最远的两个结点的距离。每两个相邻的结点的距离为1,即父亲结点与儿子结点或儿子结点与父子结点之间的距离为1.有趣的是,从树 的任意一个结点a出发,走到距离最远的结点b,再从结点b出发,能够走的最远距离,就是树的直径。树中相邻两个结点的距离为1。你的任务是:给定一棵树, 求这棵树中距离最远的两个结点的距离。

Input

输入共n行
第一行是一个正整数n,表示这棵树的结点数
接下来的n-1行,每行三个正整数a,b,w。表示结点a和结点b之间有一条边,长度为w
数据保证一定是一棵树,不必判错

Output

输出共一行
第一行仅一个数,表示这棵树的最远距离

Sample Input

4
1 2 10
1 3 12
1 4 15

Sample Output

27

HINT

10%的数据满足1<=n<=5
40%的数据满足1<=n<=100
100%的数据满足1<=n<=10000 1<=a,b<=n 1<=w<=10000

题解:

随便拿一个点进行spfa,然后找到离这个点最远的点,又进行一次spfa,然后这个点所得到的最远点,那么这个距离,就是树的直径

不要问我怎么知道这个结论的,我也不知道我怎么知道的……

记住就好……

代码:

  1. //qscqesze
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <ctime>
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <set>
  9. #include <vector>
  10. #include <sstream>
  11. #include <queue>
  12. #include <typeinfo>
  13. #include <fstream>
  14. #include <map>
  15. typedef long long ll;
  16. using namespace std;
  17. //freopen("D.in","r",stdin);
  18. //freopen("D.out","w",stdout);
  19. #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
  20. #define maxn 200001
  21. #define mod 10007
  22. #define eps 1e-9
  23. //const int inf=0x7fffffff; //无限大
  24. const int inf=0x3f3f3f3f;
  25. /*
  26. inline ll read()
  27. {
  28. int x=0,f=1;char ch=getchar();
  29. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  30. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  31. return x*f;
  32. }
  33. */
  34. //**************************************************************************************
  35. inline ll read()
  36. {
  37. int x=,f=;char ch=getchar();
  38. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  39. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  40. return x*f;
  41. }
  42. struct edge
  43. {
  44. int x,y;
  45. };
  46. struct node
  47. {
  48. int x,y;
  49. };
  50. vector<edge> kiss[maxn];
  51. void add_edge(int a,int b,int c)
  52. {
  53. kiss[a].push_back((edge){b,c});
  54. kiss[b].push_back((edge){a,c});
  55. }
  56. int vis[maxn];
  57. int dis[maxn];
  58. int main()
  59. {
  60. int n;
  61. n=read();
  62. for(int i=;i<n-;i++)
  63. {
  64. int a,b,c;
  65. a=read(),b=read(),c=read();
  66. add_edge(a,b,c);
  67. }
  68. queue<int> q;
  69. q.push();
  70. for(int i=;i<=n;i++)
  71. dis[i]=inf;
  72. dis[]=;
  73. int ans=;
  74. int ans1=;
  75. memset(vis,,sizeof(vis));
  76. vis[]=;
  77. while(!q.empty())
  78. {
  79. int now=q.front();
  80. vis[now]=;
  81. q.pop();
  82. for(int i=;i<kiss[now].size();i++)
  83. {
  84. int next=kiss[now][i].x;
  85. //cout<<dis[now]+kiss[now][i].y<<" "<<dis[next]<<endl;
  86.  
  87. if(dis[now]+kiss[now][i].y<dis[next])
  88. {
  89. dis[next]=dis[now]+kiss[now][i].y;
  90. if(vis[next]==)
  91. {
  92. vis[next]=;
  93. q.push(next);
  94. }
  95. }
  96. }
  97. }
  98. for(int i=;i<=n;i++)
  99. {
  100. if(dis[i]!=inf&&dis[i]>ans1)
  101. {
  102. ans=i;
  103. ans1=dis[i];
  104. }
  105. }
  106. for(int i=;i<=n;i++)
  107. dis[i]=inf;
  108. dis[ans]=;
  109. memset(vis,,sizeof(vis));
  110. q.push(ans);
  111. vis[ans]=;
  112. ans=;
  113. ans1=;
  114. while(!q.empty())
  115. {
  116. int now=q.front();
  117. vis[now]=;
  118. q.pop();
  119. for(int i=;i<kiss[now].size();i++)
  120. {
  121. int next=kiss[now][i].x;
  122. if(dis[now]+kiss[now][i].y<dis[next])
  123. {
  124. dis[next]=dis[now]+kiss[now][i].y;
  125. if(vis[next]==)
  126. {
  127. vis[next]=;
  128. q.push(next);
  129. }
  130. }
  131. }
  132. }
  133. for(int i=;i<=n;i++)
  134. {
  135. if(dis[i]!=inf)
  136. ans1=max(ans1,dis[i]);
  137. }
  138. cout<<ans1<<endl;
  139. }

tyvj:1520 树的直径 spfa/树的直径的更多相关文章

  1. 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分

    树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...

  2. 与图论的邂逅01:树的直径&基环树&单调队列

    树的直径 定义:树中最远的两个节点之间的距离被称为树的直径.  怎么求呢?有两种官方的算法(不要问官方指谁我也不晓得): 1.两次搜索.首先任选一个点,从它开始搜索,找到离它最远的节点x.然后从x开始 ...

  3. BZOJ3124 [Sdoi2013]直径 【树的直径】

    题目 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅有N-1 条边. 路径:一棵树上,任意两个节 ...

  4. 树形DP 学习笔记(树形DP、树的直径、树的重心)

    前言:寒假讲过树形DP,这次再复习一下. -------------- 基本的树形DP 实现形式 树形DP的主要实现形式是$dfs$.这是因为树的特殊结构决定的——只有确定了儿子,才能决定父亲.划分阶 ...

  5. 【bzoj3196】Tyvj 1730 二逼平衡树 线段树套Treap

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义 ...

  6. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2271  Solved: 935[Submit][Stat ...

  7. 图论杂项细节梳理&模板(虚树,圆方树,仙人掌,欧拉路径,还有。。。)

    orzYCB 虚树 %自为风月马前卒巨佬% 用于优化一类树形DP问题. 当状态转移只和树中的某些关键点有关的时候,我们把这些点和它们两两之间的LCA弄出来,以点的祖孙关系连成一棵新的树,这就是虚树. ...

  8. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  9. poj 2104 K-th Number (划分树入门 或者 主席树入门)

    题意:给n个数,m次询问,每次询问L到R中第k小的数是哪个 算法1:划分树 #include<cstdio> #include<cstring> #include<alg ...

随机推荐

  1. Mysql_Learning_Notes_系统结构_1_数据类型

    数据类型 整型 1.tinyint 1Bytes -128~127(255) 2.smallint 2Bytes -32768~32676(65535) 3.mdeiumint 3Bytes -838 ...

  2. C#里partial关键字的作用

    1. 什么是局部类型?C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中.局部类型适用于以下情况: (1) 类型特别大,不宜放在一个 ...

  3. Extjs 基础篇—— Function 能在定义时就能执行的方法的写法 function(){...}()

    Ext.js 中 Function能在定义时就能执行的方法的写法 function(){...}() /** * 第二部分Function:能在定义时就能执行的方法的写法 function(){... ...

  4. 10 个优质的 Laravel 扩展推荐

    这里有 10+ 个用来搭建 Laravel 应用的包 为何会创建这个包的列表?因为我是一个「比较懒」的开发者,在脸书上是多个 Laravel 小组的成员.平日遇到最多的问题就是开发是需要用那些包.我很 ...

  5. Ubuntu 16.04 使用docker资料汇总与应用docker安装caffe并使用Classifier(ros kinetic+usb_cam+caffe)

    Docker是开源的应用容器引擎.若想简单了解一下,可以参考百度百科词条Docker.好像只支持64位系统. Docker官网:https://www.docker.com/ Docker - 从入门 ...

  6. css 让背景图片不停旋转

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 阿里百川码力APP监控 来了!

    阿里百川码力APP监控  来了!这个APP监控 和手淘一起成长历经千锤百炼 走过千BUG万坑如今百川起产品   为了让你的APP更好 用户更爽! 在移动互联网时代,一款应用是否成功,用户体验是一个关键 ...

  8. Emacs 启动优化二三事

    Emacs 启动优化二三事 */--> div.org-src-container { font-size: 85%; font-family: monospace; } p {font-siz ...

  9. jmock2.5 基本教程

    目录 第0章 概述 第1章 jmock初体验 第2章 期望 第3章 返回值 第4章 参数匹配 第5章 指定方法调用次数 第6章 指定执行序列 第7章 状态机 第0章 概述 现在的dev不是仅仅要写co ...

  10. Struts 2 Tutorial Basic MVC Architecture

    Model View Controller or MVC as it is popularly called, is a software design pattern for developing ...