问题描述:
实验室里原先有一台电脑(编号为1),最近氪金带师咕咕东又为实验室购置了N-1台电脑,编号为2到N。每台电脑都用网线连接到一台先前安装的电脑上。但是咕咕东担心网速太慢,他希望知道第i台电脑到其他电脑的最大网线长度,但是可怜的咕咕东在不久前刚刚遭受了宇宙射线的降智打击,请你帮帮他。
解题思路:
一棵树中,每个点能到达的最远端点一定是树直径的两端点之一,故首先应得到树直径的两个端点,任取一个点dfs,能到达的最远端点是树直径两端点之一end1,再从end1dfs找到最远端点end2,这就是树直径的另外一个端点,🐟求每个点离其他点的最远距离只要求该点到两端点距离的最大值即可。
!!!note:
初始化很重要:边数ecnt的初始化,head数组的初始化,以及在dfs之前vis数组和maxlen的初始化!因为没有初始化导致WA,TLE多次,浪费了很多时间/(ㄒoㄒ)/~~Remember the lesson!噢还发生了一个错误,边数组的空间应该是顶点数的两倍!(因为是无向边)
Input:
输入文件包含多组测试数据。对于每组测试数据,第一行一个整数N (N<=10000),接下来有N-1行,每一行两个数,对于第i行的两个数,它们表示与i号电脑连接的电脑编号以及它们之间网线的长度。网线的总长度不会超过10^9,每个数之间用一个空格隔开。
Output:
对于每组测试数据输出N行,第i行表示i号电脑的答案 (1<=i<=N).
Sample Input
5
1 1
2 1
3 1
1 1
Sample Output
3
2
3
4
4
实验代码:
#include<iostream>
using namespace std;
#include<cstdio>
#include<algorithm>
int head[10010];
struct Edge
{
int v;
int w;
int next;
};
Edge edge[10010*2];
int ecnt;
bool vis[10010];
int end1,end2,maxlen;
int len1[10010];
int len2[10010];
void initial(int N)
{
for(int i=1;i<=N;i++)
head[i]=-1;
ecnt=0;
}
void insert_Edge(int u,int v,int w)
{
edge[ecnt].v=v;
edge[ecnt].w=w;
edge[ecnt].next=head[u];
head[u]=ecnt;
ecnt++;
edge[ecnt].v=u;
edge[ecnt].w=w;
edge[ecnt].next=head[v];
head[v]=ecnt;
ecnt++;
}
void dfs(int start,int length)
{
vis[start]=true;
if(length>maxlen)
{
end1=start;
maxlen=length;
}
for(int e=head[start];e!=-1;e=edge[e].next)
{
if(!vis[edge[e].v])
dfs(edge[e].v,length+edge[e].w);
}
}
void dfs_(int start,int length,int* len)
{
vis[start]=true;
len[start]=length;
if(length>maxlen)
{
end2=start;
maxlen=length;
}
for(int e=head[start];e!=-1;e=edge[e].next)
{
if(!vis[edge[e].v])
dfs_(edge[e].v,length+edge[e].w,len);
}
}
void getAns(int N)
{
for(int i=1;i<=N;i++)
vis[i]=0;
maxlen=0;
dfs(1,0);
maxlen=0;
for(int i=1;i<=N;i++)
vis[i]=0;
dfs_(end1,0,len1);
for(int i=1;i<=N;i++)
vis[i]=0;
dfs_(end2,0,len2);
for(int i=1;i<=N;i++)
printf("%d\n",max(len1[i],len2[i]));
}
int main(void)
{
int N;
int v,w;
while(scanf("%d",&N)==1)
{
initial(N);
for(int i=2;i<=N;i++)
{
scanf("%d%d",&v,&w);
insert_Edge(i,v,w);
}
getAns(N);
}
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)