您的位置:首页 > Web前端 > Node.js

lightoj 1257 - Farthest Nodes in a Tree (II) 树直径

2016-04-08 14:55 465 查看
给定一棵树,问树上每个点到其他的点最远的距离。

首先所有点到树的直径两端点肯定是最远的(请百度树的直径,所以就是所有点到树的直径两端点那个更长..

任选一点跑一边搜索找出来树的直径一个端点,在一遍搜索就可以找到另外一个端点,顺便求得所有点到这个端点的距离啦。

然后再来一遍求另外一个端点到所有点的距离...

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mod 1000000007
#define inf 0x3f3f3f3f
int dp[40000];
struct edge
{
int u,v,w,next;
}edge[80000];
int head[40000],tot,used[40000],s,mlen;
void init()
{
memset(dp,0,sizeof(dp));
memset(head,-1,sizeof(head));
memset(used,0,sizeof(used));
tot=0;
}
void add(int u,int v,int w)
{
edge[tot].v=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot++;
}
void dfs(int u,int pre,int len)
{
if(mlen<len)
{
s=u;
mlen=len;
}
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
int w=edge[i].w;
if(v==pre) continue;
dfs(v,u,len+w);
dp[v]=max(dp[v],len+w);
}
}
int main()
{
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
int n,u,v,w;
init();
scanf("%d",&n);
for(int i=0;i<n-1;i++)
{
scanf("%d %d %d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
s=mlen=0;
dfs(1,-1,0);
dfs(s,-1,0);
dfs(s,-1,0);
printf("Case %d:\n",cas);
for(int i=0;i<n;i++)
printf("%d\n",dp[i]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: