#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn = 100000+500;
struct edge
{
int v,w;
};
int n;
vector<edge> g[maxn];
queue<int> q;
int dis[maxn],d1[maxn],d2[maxn];
bool vis[maxn];
int bfs(int u)
{
int root=u;
memset(vis,0,sizeof(vis));
dis[u]=0;
vis[u]=1;
q.push(u);
while(!q.empty())
{
u=q.front();
q.pop();
if(dis[u]>dis[root])
root=u;
int sz=g[u].size();
for(int i=0;i<sz;i++)
{
int v=g[u][i].v;
int w=g[u][i].w;
if(vis[v])
continue;
vis[v]=1;
dis[v]=dis[u]+w;
q.push(v);
}
}
return root;
}
void solve()
{
int t=bfs(1);
t=bfs(t);
for(int i=1;i<=n;i++)
d1[i]=dis[i];
t=bfs(t);
for(int i=1;i<=n;i++)
d2[i]=dis[i];
for(int i=1;i<=n;i++)
printf("%d\n",max(d1[i],d2[i]));
}
void init()
{
for(int i=0;i<=n;i++)
{
g[i].clear();
dis[0]=-1;
}
}
int main()
{
while(~scanf("%d",&n))
{
init();
for(int i=2;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(a!=i)
{
edge t1={a,b};
edge t2={i,b};
g[i].push_back(t1);
g[a].push_back(t2);
}
}
solve();
}
return 0;
}
hdu 2196 (通过树的直径来求的方法)
最新推荐文章于 2020-05-01 16:11:11 发布