标签:技术 case 分享 cas form namespace output manager 分享图片
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=10005; 4 struct node{int to,next,len;}edge[maxn<<1]; 5 int n,x,y,cnt,head[maxn],dp[maxn][3],lgst[maxn]; 6 void add_edge(int u,int v,int w){ 7 edge[cnt].to=v; 8 edge[cnt].len=w; 9 edge[cnt].next=head[u]; 10 head[u]=cnt++; 11 } 12 int dfs1(int u,int fa){ 13 int Dmax=0,Dsec=0; 14 for(int i=head[u];~i;i=edge[i].next){ 15 int v=edge[i].to; 16 if(v^fa){ 17 int nowd=dfs1(v,u)+edge[i].len; 18 if(nowd>Dmax)lgst[u]=v,Dsec=Dmax,Dmax=nowd; 19 else if(nowd>Dsec)Dsec=nowd; 20 } 21 } 22 dp[u][0]=Dmax,dp[u][1]=Dsec; 23 return Dmax; 24 } 25 void dfs2(int u,int fa){ 26 for(int i=head[u];~i;i=edge[i].next){ 27 int v=edge[i].to; 28 if(v^fa){ 29 if(v==lgst[u])dp[v][2]=max(dp[u][2],dp[u][1])+edge[i].len; 30 else dp[v][2]=max(dp[u][2],dp[u][0])+edge[i].len; 31 dfs2(v,u); 32 } 33 } 34 } 35 int main(){ 36 while(~scanf("%d",&n)){ 37 cnt=0;memset(head,-1,sizeof(head)); 38 memset(dp,0,sizeof(dp)); 39 memset(lgst,0,sizeof(lgst)); 40 for(int i=2;i<=n;++i){ 41 scanf("%d%d",&x,&y); 42 add_edge(i,x,y); 43 add_edge(x,i,y); 44 } 45 dfs1(1,-1); 46 dfs2(1,-1); 47 for(int i=1;i<=n;++i) 48 printf("%d\n",max(dp[i][0],dp[i][2])); 49 } 50 return 0; 51 }
标签:技术 case 分享 cas form namespace output manager 分享图片
原文地址:https://www.cnblogs.com/acgoto/p/9607627.html