博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDOJ 2196 Computer 树的直径
阅读量:6706 次
发布时间:2019-06-25

本文共 3371 字,大约阅读时间需要 11 分钟。

由树的直径定义可得,树上随意一点到树的直径上的两个端点之中的一个的距离是最长的...

三遍BFS求树的直径并预处理距离.......

Computer

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3522    Accepted Submission(s): 1784


Problem Description
A school bought the first computer some time ago(so this computer's id is 1). During the recent years the school bought N-1 new computers. Each new computer was connected to one of settled earlier. Managers of school are anxious about slow functioning of the net and want to know the maximum distance Si for which i-th computer needs to send signal (i.e. length of cable to the most distant computer). You need to provide this information. 
Hint: the example input is corresponding to this graph. And from the graph, you can see that the computer 4 is farthest one from 1, so S1 = 3. Computer 4 and 5 are the farthest ones from 2, so S2 = 2. Computer 5 is the farthest one from 3, so S3 = 3. we also get S4 = 4, S5 = 4.
 

Input
Input file contains multiple test cases.In each case there is natural number N (N<=10000) in the first line, followed by (N-1) lines with descriptions of computers. i-th line contains two natural numbers - number of computer, to which i-th computer is connected and length of cable used for connection. Total length of cable does not exceed 10^9. Numbers in lines of input are separated by a space.
 

Output
For each case output N lines. i-th line must contain number Si for i-th computer (1<=i<=N).
 

Sample Input
 
5 1 1 2 1 3 1 1 1
 

Sample Output
 
3 2 3 4 4
 

Author
scnu
 

#include 
#include
#include
#include
#include
using namespace std;const int maxn=20010;struct Edge{ int to,next,w;}edge[maxn*2];int Adj[maxn],Size;void init(){ memset(Adj,-1,sizeof(Adj)); Size=0;}void add_edge(int u,int v,int w){ edge[Size].to=v; edge[Size].w=w; edge[Size].next=Adj[u]; Adj[u]=Size++;}int dist_s[maxn],dist_t[maxn],dist[maxn];int n;bool vis[maxn];int bfs1(){ int ret=1; queue
q; memset(vis,false,sizeof(vis)); q.push(1); dist[1]=0; vis[1]=true; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=Adj[u];~i;i=edge[i].next) { int v=edge[i].to; int c=edge[i].w; if(vis[v]) continue; dist[v]=dist[u]+c; vis[v]=true; q.push(v); if(dist[v]>dist[ret]) ret=v; } } return ret;}int bfs2(int x){ int ret=x; queue
q; memset(vis,false,sizeof(vis)); q.push(x); vis[x]=true; dist_s[x]=0; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=Adj[u];~i;i=edge[i].next) { int v=edge[i].to; int c=edge[i].w; if(vis[v]==true) continue; vis[v]=true; dist_s[v]=dist_s[u]+c; q.push(v); if(dist_s[v]>dist_s[ret]) ret=v; } } return ret;}int bfs3(int x){ int ret=x; queue
q; memset(vis,false,sizeof(vis)); q.push(x); vis[x]=true; dist_t[x]=0; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=Adj[u];~i;i=edge[i].next) { int v=edge[i].to; int c=edge[i].w; if(vis[v]==true) continue; vis[v]=true; dist_t[v]=dist_t[u]+c; q.push(v); if(dist_t[v]>dist_t[ret]) ret=v; } } return ret;}int main(){ while(scanf("%d",&n)!=EOF) { init(); memset(dist_s,0,sizeof(dist_s)); memset(dist_t,0,sizeof(dist_t)); memset(dist,0,sizeof(dist)); for(int i=2;i<=n;i++) { int x,w; scanf("%d%d",&x,&w); add_edge(x,i,w); add_edge(i,x,w); } int s=bfs1(); int t=bfs2(s); bfs3(t); //cout<<"s: "<
<<" t: "<
<

转载地址:http://msflo.baihongyu.com/

你可能感兴趣的文章
[Python]Hamming distance 问题
查看>>
详解游标
查看>>
[CareerCup] 3.1 Implement Three Stacks using Array 使用数组来实现三个栈
查看>>
《xUnit Test Patterns》学习笔记5 - xUnit基础
查看>>
Linux下锁定账号,禁止登录系统的设置总结
查看>>
STM32启动过程解析-2.02固件库启动文件分析
查看>>
PLSQL Developer设置及快捷键设置
查看>>
《深入浅出MFC》笔记(四)
查看>>
第 15 章 Div+CSS页面设计
查看>>
[LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k
查看>>
linux运维
查看>>
Go中的CGI包使用
查看>>
移动端产品上线流程
查看>>
博客园被黑了?
查看>>
[Struts]学习日记2 - 增加一些验证
查看>>
js 获取浏览器高度和宽度值(多浏览器)
查看>>
防CSRF攻击:一场由重复提交的问题引发的前端后端测试口水战
查看>>
第 23 章 H3C ICG(Information Communication Gateway)
查看>>
asp.net中对URL的一些操作
查看>>
9.4. title
查看>>