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就出来了,一看题解,嗯……加一行再求逆矩阵从而得到 ...
随机推荐
- 数据库之mysql篇(3)—— mysql创建/修改数据表/操作表数据
创建数据表:create table 数据表名 1.创建表规范 create table 表名( 列名 数据类型 是否为空 自动排序/默认值 主键/外键/唯一键, 列名 数据类型 ...
- win10系统中如何解决cmd中的路径和现在电脑的用户名不一致
假设原用户名老王,已删除,但是cmd后路径还是C:\Users\老王>,这与现在用户laowng不一致了需改为C:\Users\laowang>. .先新建一个管理员账户laowang,然 ...
- java求解第N个素数(质数)
面试中,遇到一个题目:求解第N个素数. import java.util.Scanner; public class GetPrimeNumber { public static int NthPri ...
- Win 10 启用Linux子系统---Kali 和Ubuntu子系统
注:转载请注明出处,谢谢!!! 一.Linux on Windows简介 Win10一周年版推出了用于Windows的Linux子系统这一功能.Linux子系统和Windows的结合真是有一种神互补. ...
- Linux 小知识翻译 - 「日志」(log)
这次聊聊「日志」. 「日志」主要指系统或者软件留下的「记录」.出自表示「航海日志」的「logbook」. 经常听说「出现问题的时候,或者程序没有安装自己预期的来运行的时候,请看看日志!」. 确实,记录 ...
- 12.scrapy框架之递归解析和post请求
今日概要 递归爬取解析多页页面数据 scrapy核心组件工作流程 scrapy的post请求发送 今日详情 1.递归爬取解析多页页面数据 - 需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久 ...
- UDP Health Checks
This chapter describes how to configure different types of health checks for UDP servers in a load-b ...
- linux下last与lastb命令详解
在linux系统中,last与lastb命令用来列出目前与过去登录系统的用户相关信息.指令英文原义: last, lastb - show listing of last logged in user ...
- .Net环境下调用ProtoBuf
一.什么是ProtoBuf protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.它是一种类似于xml.json等类似作用的交互格式.由于它是一种 ...
- ESP8266串口和MQTT服务器消息互传(版本一) 单纯透传+保存WIFI账号信息
目标 制作一个ESP8266串口和MQTT相互透传的小WIFI,可用手机修改其连接的路由器,由此该模块可以任意加载到各种串口传输的单片机上,完成硬件到云端的传输. 1 实物图 2 MQTT网页测试客户 ...