链接:https://www.icpc.camp/contests/4mYguiUR8k0GKE

H. Highway

The input contains zero or more test cases and is terminated by end-of-file. For each test case: The first line contains an integer n. The i-th of the following (n − 1) lines contains three integers ai , bi and ci

. • 1 ≤ n ≤ 105

• 1 ≤ ai , bi ≤ n

• 1 ≤ ci ≤ 108

• The number of test cases does not exceed 10.

题意:

每次连接最远的两点,直到所有点都相通。

最多有n-1条边

题解:

如何每次都找到最远的两个点呢?

我们需要用到一个定理:树上的任何一个点的最远点一定会是<树的直径>中的一个

树的直径指:树上的最远的两个点

接下来我们证明这个定理——

1,利用这个定理,我们可以从<1节点>dfs找到一个直径上的点。

2,用直径上的这个点dfs可以找到另外一个直径上的点。

3,找出所有点到这两个直径上的点的距离

4,将所有点都连接在直径的两个点之一,就是答案了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e5+5;
  4. int f[maxn],nex[2*maxn],w[2*maxn],tob[2*maxn],inde;
  5. long long dis1[maxn],dis2[maxn];
  6. bool vis[maxn];
  7. long long s1,maxdis,s2;
  8. long long madis=-1;
  9. void add(int a,int b,int wn)
  10. {
  11. inde++;
  12. tob[inde]=b;
  13. w[inde]=wn;
  14. nex[inde]=f[a];
  15. f[a]=inde;
  16. }
  17. void dfs1(int x,long long v)
  18. {
  19. vis[x]=0;
  20. for(int i=f[x];i;i=nex[i])
  21. {
  22. if(vis[tob[i]])
  23. {
  24. long long gg=v+w[i];
  25. if(gg>madis)
  26. {
  27.  
  28. madis=gg;
  29. s1=tob[i];
  30. }
  31. dfs1(tob[i],gg);
  32. }
  33. }
  34. }
  35. void dfs2(int x,long long v)
  36. {
  37. vis[x]=0;
  38. for(int i=f[x];i;i=nex[i])
  39. {
  40. if(vis[tob[i]])
  41. {
  42. long long gg=v+w[i];
  43. if(gg>maxdis)
  44. {
  45. maxdis=gg;
  46. s2=tob[i];
  47. }
  48. dis1[tob[i]]=gg;
  49. dfs2(tob[i],gg);
  50. }
  51. }
  52. }
  53. void dfs3(int x,long long v)
  54. {
  55. vis[x]=0;
  56. for(int i=f[x];i;i=nex[i])
  57. {
  58. if(vis[tob[i]])
  59. {
  60. long long gg=v+w[i];
  61. dis2[tob[i]]=gg;
  62. dfs3(tob[i],gg);
  63. }
  64. }
  65. }
  66. int main()
  67. {
  68. int n;
  69. while(cin>>n)
  70. {
  71. inde=0;
  72. for(int i=1;i<=n;i++)f[i]=0;
  73. for(int i=1;i<n;i++)
  74. {
  75. int a,b,wn;
  76. scanf("%d %d %d",&a,&b,&wn);
  77. add(a,b,wn);
  78. add(b,a,wn);
  79. }
  80. maxdis=madis=-1;
  81. for(int i=1;i<=n;i++)vis[i]=1;
  82. dfs1(1,0);
  83. for(int i=1;i<=n;i++)vis[i]=1;
  84. dfs2(s1,0);
  85. for(int i=1;i<=n;i++)vis[i]=1;
  86. dfs3(s2,0);
  87. long long ans=maxdis;
  88. for(int i=1;i<=n;i++)
  89. {
  90. if(i==s1||i==s2)continue;
  91. ans+=max(dis1[i],dis2[i]);
  92. }
  93. cout<<ans<<endl;
  94. }
  95. return 0;
  96. }

  

2017湘潭大学邀请赛H题(树的直径)的更多相关文章

  1. XTU 1267 - Highway - [树的直径][2017湘潭邀请赛H题(江苏省赛)]

    这道题可能有毒……总之一会儿能过一会儿不能过的,搞的我很心烦…… 依然是上次2017江苏省赛的题目,之前期末考试结束了之后有想补一下这道题,当时比较懵逼不知道怎么做……看了题解也不是很懂……就只好放弃 ...

  2. 2017湘潭大学邀请赛E题(贪心)

    链接:https://www.icpc.camp/contests/4mYguiUR8k0GKE Partial Sum Input The input contains zero or more t ...

  3. 2017湘潭大学邀请赛G题(贪心+优先队列)

    参考博客:http://www.cnblogs.com/chendl111/p/6891770.html 题目链接:https://www.icpc.camp/contests/4mYguiUR8k0 ...

  4. POJ 1985 Cow Marathon (模板题)(树的直径)

    <题目链接> 题目大意: 给定一颗树,求出树的直径. 解题分析:树的直径模板题,以下程序分别用树形DP和两次BFS来求解. 树形DP: #include <cstdio> #i ...

  5. XTU 1264 - Partial Sum - [2017湘潭邀请赛E题(江苏省赛)]

    2017江苏省赛的E题,当时在场上看错了题目没做出来,现在补一下…… 题目链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id ...

  6. POJ 2631 Roads in the North (模板题)(树的直径)

    <题目链接> 题目大意:求一颗带权树上任意两点的最远路径长度. 解题分析: 裸的树的直径,可由树形DP和DFS.BFS求解,下面介绍的是BFS解法. 在树上跑两遍BFS即可,第一遍BFS以 ...

  7. HDU 6271 Master of Connected Component(2017 CCPC 杭州 H题,树分块 + 并查集的撤销)

    题目链接  2017 CCPC Hangzhou Problem H 思路:对树进行分块.把第一棵树分成$\sqrt{n}$块,第二棵树也分成$\sqrt{n}$块.    分块的时候满足每个块是一个 ...

  8. HDU 4597 Play Game 2013 ACM-ICPC吉林通化全国邀请赛H题

    九野的博客,转载请注明出处:  http://blog.csdn.net/acmmmm/article/details/10833941 题意:给定T个测试数据,下面有2副牌,每副n张,每张都有一个分 ...

  9. XTU 1260 - Determinant - [2017湘潭邀请赛A题(江苏省赛)][高斯消元法][快速幂和逆元]

    是2017江苏省赛的第一题,当时在场上没做出来(废话,那个时候又不懂高斯消元怎么写……而且数论也学得一塌糊涂,现在回来补了) 省赛结束之后,题解pdf就出来了,一看题解,嗯……加一行再求逆矩阵从而得到 ...

随机推荐

  1. H5——简易马祖

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  2. Spring MVC 异常处理 (九)

    完整的项目案例: springmvc.zip 目录 实例 除了依赖spring-webmvc还需要依赖jackson-databind(用于转换json数据格式) <dependency> ...

  3. [Hive_8] Hive 设计优化

    0. 说明 在 Hive 中,数据库是一个文件夹,表也是文件夹 partition,是一个字段,是文件 前提:在 Hive 进行 where 子句查询的时候,会将条件语句和全表进行比对,搜索出所需的数 ...

  4. Qt在多线程中使用信号槽的示例

    之前对线程理解得不深入,所以对Qt的线程机制没有搞清楚,今天写一篇文章总结一下,如有错误,欢迎指出. 首先需要理解线程是什么,线程在代码中的表现其实就是一个函数,只不过这个函数和主线程的函数同时运行, ...

  5. LeetCode算法题-Best Time to Buy and Sell Stock

    这是悦乐书的第172次更新,第174篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第31题(顺位题号是121).假设有一个数组,其中第i个元素是第i天给定股票的价格.如果 ...

  6. css点滴1—八种方式实现元素垂直居中

    这里介绍实现元素垂直居中的方式,文章是参考了<css制作水平垂直居中对齐>这一篇文章. 1.行高和高度实现 这种方式实现单行垂直居中是很简单的,但是要保证元素内容是单行的,并且其高度是不变 ...

  7. 关于发邮件报错535 Error:authentication failed解决方法

    写在最前面 相信看到535报错的同学代码编写方面都没有问题,只是不明白为什么填写了帐号密码后还是报535错误,这里我以163邮箱为例,并使用Python讲解怎么解决535问题 代码如下: import ...

  8. 2.05-random-uesr-proxy

    import urllib.request def proxy_user(): proxy_list = [ {"https":""}, # {"ht ...

  9. 《程序员的自我修养》读书笔记——系统调用、API

        系统调用 程序运行的时候,本身是没有权限访问多少系统资源的.系统资源有限,如果操作系统不进行控制,那么各个程序难免会产生冲突.线程操作系统都将可能产生冲突的系统资源保护起来,阻止程序直接访问. ...

  10. CSS--块级元素和行内元素

    相同:设置后,对应的模块都会脱离文档流 不同点:position相应的块级元素会覆盖下面的内容(文字,),而float只会覆盖块级元素,里面的文字会脱离 出来 float是浮动定位,position是 ...