标签:ble src mit bsp continue ttl print ring mil
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6716 Accepted Submission(s): 3361
mx表示次大值
转移;1、其子树
2、经过根
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int N=1e4+5; struct edge{int v,w,next;}e[N<<1];int tot,head[N]; int MX[N],MAXid[N]; int mx[N],maxid[N]; int n,m; inline void add(int x,int y,int z){ e[++tot].v=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot; e[++tot].v=x;e[tot].w=z;e[tot].next=head[y];head[y]=tot; } void PreDfs(int x,int f){ MX[x]=mx[x]=0; for(int i=head[x],y;i;i=e[i].next){ if((y=e[i].v)==f) continue; PreDfs(y,x); if(mx[x]<MX[y]+e[i].w){ mx[x]=MX[y]+e[i].w; maxid[x]=y; if(mx[x]>MX[x]){ swap(MX[x],mx[x]); swap(MAXid[x],maxid[x]); } } } } void SolDfs(int x,int f){ for(int i=head[x],y;i;i=e[i].next){ if((y=e[i].v)==f) continue; if(y==MAXid[x]){ if(mx[y]<mx[x]+e[i].w){ mx[y]=mx[x]+e[i].w; maxid[y]=x; if(mx[y]>MX[y]){ swap(MX[y],mx[y]); swap(MAXid[y],maxid[y]); } } } else{ if(mx[y]<MX[x]+e[i].w){ mx[y]=MX[x]+e[i].w; maxid[y]=x; if(mx[y]>MX[y]){ swap(MX[y],mx[y]); swap(MAXid[y],maxid[y]); } } } SolDfs(y,x); } } int main(){ while(~scanf("%d",&n)){ tot=0;memset(head,0,sizeof head); for(int i=2,y,z;i<=n;i++) scanf("%d%d",&y,&z),add(i,y,z); PreDfs(1,-1); SolDfs(1,-1); for(int i=1;i<=n;i++) printf("%d\n",MX[i]); } return 0; }
标签:ble src mit bsp continue ttl print ring mil
原文地址:http://www.cnblogs.com/shenben/p/6707018.html