求每个节点到距离他最远节点的距离。
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<sstream> #include<cmath> #include<climits> #include<string> #include<map> #include<queue> #include<vector> #include<stack> #include<set> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; #define pb(a) push_back(a) #define INF 0x1f1f1f1f #define lson idx<<1,l,mid #define rson idx<<1|1,mid+1,r #define PI 3.1415926535898 template<class T> T min(const T& a,const T& b,const T& c) { return min(min(a,b),min(a,c)); } template<class T> T max(const T& a,const T& b,const T& c) { return max(max(a,b),max(a,c)); } void debug() { #ifdef ONLINE_JUDGE #else freopen("d:\in.txt","r",stdin); // freopen("d:\out1.txt","w",stdout); #endif } int getch() { int ch; while((ch=getchar())!=EOF) { if(ch!=' '&&ch!=' ')return ch; } return EOF; } const int maxn=10100; struct EDGE { int u,v,w; EDGE(){} EDGE(int a,int b,int c):u(a),v(b),w(c){} }; vector<EDGE> e; vector<int> g[maxn]; ll f1[maxn],f2[maxn]; int son1[maxn],son2[maxn]; ll StepOne(int x,int fa) { f1[x]=0;f2[x]=0; son1[x]=-1;son2[x]=-1; for(int i=0;i<g[x].size();i++) { int v=e[g[x][i]].v,w=e[g[x][i]].w; if(v!=fa) { ll res=StepOne(v,x); if(res+w>=f1[x]) { f2[x]=f1[x]; son2[x]=son1[x]; f1[x]=res+w; son1[x]=v; } else if(res+w>=f2[x]) { f2[x]=res+w; son2[x]=v; } } } return f1[x]; } int StepTwo(int x,int fa,int ei) { if(fa!=-1) { if(son1[fa]!=x) { if(f1[fa]+e[ei].w>=f1[x]) { f2[x]=f1[x]; son2[x]=son1[x]; f1[x]=f1[fa]+e[ei].w; son1[x]=fa; }else if(f1[fa]+e[ei].w>=f2[x]) { f2[x]=f1[fa]+e[ei].w; son2[x]=fa; } }else { if(f2[fa]+e[ei].w>=f1[x]) { f2[x]=f1[x]; son2[x]=son1[x]; f1[x]=f2[fa]+e[ei].w; son1[x]=fa; }else if(f2[fa]+e[ei].w>=f2[x]) { f2[x]=f2[fa]+e[ei].w; son2[x]=fa; } } } for(int i=0;i<g[x].size();i++) { int v=e[g[x][i]].v; if(v!=fa) { StepTwo(v,x,g[x][i]); } } return 0; } void read(int n) { for(int i=1;i<=n;i++) g[i].clear(); e.clear(); for(int i=2;i<=n;i++) { int v,w; scanf("%d%d",&v,&w); e.push_back(EDGE(i,v,w)); g[i].push_back(e.size()-1); e.push_back(EDGE(v,i,w)); g[v].push_back(e.size()-1); } } int main() { // freopen("in.txt","r",stdin); int n; while(scanf("%d",&n)!=EOF) { read(n); StepOne(1,-1); StepTwo(1,-1,-1); for(int i=1;i<=n;i++) printf("%I64d ",f1[i]); } return 0; }