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

三遍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 <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue> 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<int> 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<int> 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<int> 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: "<<s<<" t: "<<t<<endl;
for(int i=1;i<=n;i++)
{
printf("%d\n",max(dist_s[i],dist_t[i]));
}
}
return 0;
}

HDOJ 2196 Computer 树的直径的更多相关文章

  1. hdu 2196 Computer 树的直径

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem ...

  2. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  3. hdoj 2196 Computer【树的直径求所有的以任意节点为起点的一个最长路径】

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  4. HDU 2196 Computer (树dp)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 给你n个点,n-1条边,然后给你每条边的权值.输出每个点能对应其他点的最远距离是多少 ...

  5. HDOJ --- 2196 Computer

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  6. [hdu2196]Computer树的直径

    题意:求树中距离每个节点的最大距离. 解题关键:两次dfs,第一次从下向上dp求出每个节点子树中距离其的最大距离和不在经过最大距离上的子节点上的次大距离(后序遍历),第二次从上而下dp求出其从父节点过 ...

  7. HDU 2196.Computer 树形dp 树的直径

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  8. codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径

    题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” ...

  9. codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点

    J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...

随机推荐

  1. 7 C#变量-把你想要的东西存在C#程序里边

    现在你已经可以用Console.WriteLine("")在dos窗口里打印一些东西出来,而且你还会使用c#进行数学运算.接下来的一步你要开始学习使用变量了.用c#编程,变量就是一 ...

  2. Java&Xml教程(一)简介

    XML是广泛用于数据传输和存储的技术.Java语言提供个各种各样的API来解析XML,例如DOM.SAX.StAX.JAXB.也还有一些其他的API用于解析XML,例如JDOM.本教程的目的是探索使用 ...

  3. 解决Android弹出软键盘导致的问题

    一.当Activity启动后EditText直接获取了焦点,此时软键盘会自动弹出,这种体验并不是很好,因此要做的Activity启动不自动弹出软键盘,只需要在Manifest中对应的Activity添 ...

  4. 1B课程笔记分享_StudyJams_2017

    课程1B 概述 课程1B主要讲解了Android UI的ViewGroups(视图组).LinearLayout(线性布局).RelativeLayout(相对布局),Portrait Mode(竖屏 ...

  5. strut2 拦截器 使用

    拦截器是strut2里一个很振奋人心的应用.通过配置拦截器可以在action执行之前进行一些初始化或者是其他的操作,但是在action执行之后,返回结果就已经确定,结果是很难改变了(目前我还不知道怎么 ...

  6. CSS平滑过渡动画:transition

    <html> <head> <link href="http://cdn.bootcss.com/twitter-bootstrap/3.0.2/css/boo ...

  7. demo记录

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http ...

  8. Django - orm外键操作

    1.orm外键操作 创建外键: 备注:ForeignKey两个参数,1个为关联的表名,1个为关联的字段名: 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避 ...

  9. 环状序列(Circular Sequence, ACM/ICPC Seoul 2004, UVa1584)

    长度为n的环状串有n种表示法,分别为从某 个位置开始顺时针得到.例如,图3-4的环状串 有10种表示: CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等. 在这些表示法中,字典序最小 ...

  10. case....when ...多重判断

    CASE...WHEN 进行多重判断 CASE WHEN A  IS NOT NULL THEN B WHEN C IS NULL THEN CASE WHEN D IS NOT NULL THEN ...