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

三遍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. linux上搭建svn

    参照网址:http://www.cnblogs.com/LusYoHo/p/6056377.html(如何在linux下搭建svn服务)                http://www.cnblo ...

  2. Axure基础教程

    文字教程:      https://www.axure.com.cn/3608/ 视频教程:      http://www.iqiyi.com/playlist409963402.html

  3. bindColumn、bindParam与bindValue的区别

    bindColumn:绑定一列到一个 PHP 变量(类似于list()函数为变量赋值) <?php //连接数据库函数 functionconnect() { try { $dbh = new ...

  4. PHP 之ip查询接口

    /** * @param $ip 待查询的ip * @return mixed */ function getIpAddressInfo($ip) { $ipurl = 'http://api.ip1 ...

  5. iOS标准库中常用数据结构和算法之查找

    参数: key: [in] 要查找的元素.base:[in] 数组元素的首地址.nelp: [in/out] 数组的元素个数指针.width: [in] 数组中每个元素的尺寸.compar: [in] ...

  6. EF-调用sql进行操作

    一丶执行 class Program { static void Main(string[] args) { var db = new TestDBEntities(); string sql = @ ...

  7. linux常用命令--ubuntu

    linux 操作系统 一.linux 操作系统概述 二.安装linux系统 三.linux系统环境 ubuntu,默认有6个命令交互通道和一个图形界面交互通道,默认进入到的是图形界面通道 命令交互模式 ...

  8. c#用控制台程序安装启动停止卸载服务

    第一步:新建控制台项目  第二步:添加服务 第三步:右键新建完成的服务项 点击 在start 和stop事件中分别写上   第四步 编写代码 双击打开 using System; using Syst ...

  9. Django - 路由对应关系

    1.对url路由关系命名,以后可以根据此名称,生成自己想要的url urls.py中: url('^fdsaafdf(\d+)/',views.index,name='indexx') url('^f ...

  10. Python-程序的控制结构

    程序的分支结构 >单分支结构 根据判断条件结果而选择不同向前路径的运行方式 if <条件>: <语句块> 代码示例: guess = eval(input()) if g ...