标签:
题目链接:
Time Limit: 1000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
/* 2196 15MS 1976K 2205 B G++ 2014300227*/ #include <bits/stdc++.h> using namespace std; const int N=1e4+4; typedef long long ll; const double PI=acos(-1.0); int n,vis[N],head[N],cnt,a,b,dp[N],fp[N],mmax,ending; queue<int>qu; struct Edge { int to,next,val; }; Edge edge[2*N]; void add_edge(int s,int e,int va) { edge[cnt].to=e; edge[cnt].next=head[s]; edge[cnt].val=va; head[s]=cnt++; } void dfs(int x,int leng) { if(leng>mmax) { ending=x; mmax=leng; } vis[x]=1; for(int i=head[x];i!=-1;i=edge[i].next) { int y=edge[i].to; if(!vis[y]) { dfs(y,leng+edge[i].val); } } } void bfs1() { qu.push(ending); dp[ending]=0; vis[ending]=0; while(!qu.empty()) { int fr=qu.front(); qu.pop(); for(int i=head[fr];i!=-1;i=edge[i].next) { int y=edge[i].to; if(vis[y]) { dp[y]=dp[fr]+edge[i].val; qu.push(y); vis[y]=0; } } } } void bfs2() { int start,mmx=0; for(int i=1;i<=n;i++) { if(dp[i]>mmx) { start=i; mmx=dp[i]; } } qu.push(start); fp[start]=0; vis[start]=1; while(!qu.empty()) { int fr=qu.front(); qu.pop(); for(int i=head[fr];i!=-1;i=edge[i].next) { int y=edge[i].to; if(!vis[y]) { fp[y]=fp[fr]+edge[i].val; dp[y]=max(dp[y],fp[y]); vis[y]=1; qu.push(y); } } } } int main() { while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) { vis[i]=0; head[i]=-1; } cnt=0; mmax=0; for(int i=2;i<=n;i++) { scanf("%d%d",&a,&b); add_edge(i,a,b); add_edge(a,i,b); } dfs(1,0); bfs1(); bfs2(); for(int i=1;i<=n;i++) { printf("%d\n",dp[i]); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/zhangchengc919/p/5380266.html