2017湘潭大学邀请赛H题(树的直径)
链接: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,将所有点都连接在直径的两个点之一,就是答案了
- #include<bits/stdc++.h>
- using namespace std;
- const int maxn=1e5+5;
- int f[maxn],nex[2*maxn],w[2*maxn],tob[2*maxn],inde;
- long long dis1[maxn],dis2[maxn];
- bool vis[maxn];
- long long s1,maxdis,s2;
- long long madis=-1;
- void add(int a,int b,int wn)
- {
- inde++;
- tob[inde]=b;
- w[inde]=wn;
- nex[inde]=f[a];
- f[a]=inde;
- }
- void dfs1(int x,long long v)
- {
- vis[x]=0;
- for(int i=f[x];i;i=nex[i])
- {
- if(vis[tob[i]])
- {
- long long gg=v+w[i];
- if(gg>madis)
- {
- madis=gg;
- s1=tob[i];
- }
- dfs1(tob[i],gg);
- }
- }
- }
- void dfs2(int x,long long v)
- {
- vis[x]=0;
- for(int i=f[x];i;i=nex[i])
- {
- if(vis[tob[i]])
- {
- long long gg=v+w[i];
- if(gg>maxdis)
- {
- maxdis=gg;
- s2=tob[i];
- }
- dis1[tob[i]]=gg;
- dfs2(tob[i],gg);
- }
- }
- }
- void dfs3(int x,long long v)
- {
- vis[x]=0;
- for(int i=f[x];i;i=nex[i])
- {
- if(vis[tob[i]])
- {
- long long gg=v+w[i];
- dis2[tob[i]]=gg;
- dfs3(tob[i],gg);
- }
- }
- }
- int main()
- {
- int n;
- while(cin>>n)
- {
- inde=0;
- for(int i=1;i<=n;i++)f[i]=0;
- for(int i=1;i<n;i++)
- {
- int a,b,wn;
- scanf("%d %d %d",&a,&b,&wn);
- add(a,b,wn);
- add(b,a,wn);
- }
- maxdis=madis=-1;
- for(int i=1;i<=n;i++)vis[i]=1;
- dfs1(1,0);
- for(int i=1;i<=n;i++)vis[i]=1;
- dfs2(s1,0);
- for(int i=1;i<=n;i++)vis[i]=1;
- dfs3(s2,0);
- long long ans=maxdis;
- for(int i=1;i<=n;i++)
- {
- if(i==s1||i==s2)continue;
- ans+=max(dis1[i],dis2[i]);
- }
- cout<<ans<<endl;
- }
- return 0;
- }
2017湘潭大学邀请赛H题(树的直径)的更多相关文章
- XTU 1267 - Highway - [树的直径][2017湘潭邀请赛H题(江苏省赛)]
这道题可能有毒……总之一会儿能过一会儿不能过的,搞的我很心烦…… 依然是上次2017江苏省赛的题目,之前期末考试结束了之后有想补一下这道题,当时比较懵逼不知道怎么做……看了题解也不是很懂……就只好放弃 ...
- 2017湘潭大学邀请赛E题(贪心)
链接:https://www.icpc.camp/contests/4mYguiUR8k0GKE Partial Sum Input The input contains zero or more t ...
- 2017湘潭大学邀请赛G题(贪心+优先队列)
参考博客:http://www.cnblogs.com/chendl111/p/6891770.html 题目链接:https://www.icpc.camp/contests/4mYguiUR8k0 ...
- POJ 1985 Cow Marathon (模板题)(树的直径)
<题目链接> 题目大意: 给定一颗树,求出树的直径. 解题分析:树的直径模板题,以下程序分别用树形DP和两次BFS来求解. 树形DP: #include <cstdio> #i ...
- XTU 1264 - Partial Sum - [2017湘潭邀请赛E题(江苏省赛)]
2017江苏省赛的E题,当时在场上看错了题目没做出来,现在补一下…… 题目链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id ...
- POJ 2631 Roads in the North (模板题)(树的直径)
<题目链接> 题目大意:求一颗带权树上任意两点的最远路径长度. 解题分析: 裸的树的直径,可由树形DP和DFS.BFS求解,下面介绍的是BFS解法. 在树上跑两遍BFS即可,第一遍BFS以 ...
- HDU 6271 Master of Connected Component(2017 CCPC 杭州 H题,树分块 + 并查集的撤销)
题目链接 2017 CCPC Hangzhou Problem H 思路:对树进行分块.把第一棵树分成$\sqrt{n}$块,第二棵树也分成$\sqrt{n}$块. 分块的时候满足每个块是一个 ...
- HDU 4597 Play Game 2013 ACM-ICPC吉林通化全国邀请赛H题
九野的博客,转载请注明出处: http://blog.csdn.net/acmmmm/article/details/10833941 题意:给定T个测试数据,下面有2副牌,每副n张,每张都有一个分 ...
- XTU 1260 - Determinant - [2017湘潭邀请赛A题(江苏省赛)][高斯消元法][快速幂和逆元]
是2017江苏省赛的第一题,当时在场上没做出来(废话,那个时候又不懂高斯消元怎么写……而且数论也学得一塌糊涂,现在回来补了) 省赛结束之后,题解pdf就出来了,一看题解,嗯……加一行再求逆矩阵从而得到 ...
随机推荐
- H5——简易马祖
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- Spring MVC 异常处理 (九)
完整的项目案例: springmvc.zip 目录 实例 除了依赖spring-webmvc还需要依赖jackson-databind(用于转换json数据格式) <dependency> ...
- [Hive_8] Hive 设计优化
0. 说明 在 Hive 中,数据库是一个文件夹,表也是文件夹 partition,是一个字段,是文件 前提:在 Hive 进行 where 子句查询的时候,会将条件语句和全表进行比对,搜索出所需的数 ...
- Qt在多线程中使用信号槽的示例
之前对线程理解得不深入,所以对Qt的线程机制没有搞清楚,今天写一篇文章总结一下,如有错误,欢迎指出. 首先需要理解线程是什么,线程在代码中的表现其实就是一个函数,只不过这个函数和主线程的函数同时运行, ...
- LeetCode算法题-Best Time to Buy and Sell Stock
这是悦乐书的第172次更新,第174篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第31题(顺位题号是121).假设有一个数组,其中第i个元素是第i天给定股票的价格.如果 ...
- css点滴1—八种方式实现元素垂直居中
这里介绍实现元素垂直居中的方式,文章是参考了<css制作水平垂直居中对齐>这一篇文章. 1.行高和高度实现 这种方式实现单行垂直居中是很简单的,但是要保证元素内容是单行的,并且其高度是不变 ...
- 关于发邮件报错535 Error:authentication failed解决方法
写在最前面 相信看到535报错的同学代码编写方面都没有问题,只是不明白为什么填写了帐号密码后还是报535错误,这里我以163邮箱为例,并使用Python讲解怎么解决535问题 代码如下: import ...
- 2.05-random-uesr-proxy
import urllib.request def proxy_user(): proxy_list = [ {"https":""}, # {"ht ...
- 《程序员的自我修养》读书笔记——系统调用、API
系统调用 程序运行的时候,本身是没有权限访问多少系统资源的.系统资源有限,如果操作系统不进行控制,那么各个程序难免会产生冲突.线程操作系统都将可能产生冲突的系统资源保护起来,阻止程序直接访问. ...
- CSS--块级元素和行内元素
相同:设置后,对应的模块都会脱离文档流 不同点:position相应的块级元素会覆盖下面的内容(文字,),而float只会覆盖块级元素,里面的文字会脱离 出来 float是浮动定位,position是 ...