首页 > 代码库 > HDU 2196 Computer

HDU 2196 Computer

第一次dfs求出每个点的最大和次大长度,由下向上更新

第二次由上向下更新。第二次dfs是为了处理某个点,最大长度不是向子节点延伸的长度,而是从父亲节点过来的

 

  1 #include<iostream>  2 #include<cstdio>  3 #include<cstring>  4 #include<string>  5 #include<set>  6 #include<vector>  7 #include<map>  8 #include<algorithm>  9 #include<cmath> 10 #include<stack> 11 #include<stdlib.h> 12 using namespace std; 13 #define mmax 10000+10 14 int F_max[mmax],S_max[mmax],F_maxid[mmax],S_maxid[mmax]; 15 const int MAXN=10010; 16 int tol; 17 struct Node 18 { 19     int to; 20     int next; 21     int len; 22 }edge[MAXN*2]; 23 int head[MAXN]; 24 void add(int a,int b,int len) 25 { 26     edge[tol].to=b; 27     edge[tol].len=len; 28     edge[tol].next=head[a]; 29     head[a]=tol++; 30     edge[tol].to=a; 31     edge[tol].len=len; 32     edge[tol].next=head[b]; 33     head[b]=tol++; 34 } 35 int n; 36 void dfs1(int pos,int fa) 37 { 38    //cout<<"spo="<<pos<<endl; 39     F_max[pos]=S_max[pos]=0; 40     F_maxid[pos]=S_maxid[pos]=0; 41     for(int i=head[pos]; i!=-1; i=edge[i].next){ 42         int to=edge[i].to; 43         if(fa==to) 44             continue; 45         int llen=edge[i].len; 46         dfs1(to,pos); 47         if(S_max[pos]<F_max[to]+llen){ 48             S_max[pos]=F_max[to]+llen; 49             S_maxid[pos]=to; 50             if(S_max[pos]>F_max[pos]){ 51                 swap(S_max[pos],F_max[pos]); 52                 swap(S_maxid[pos],F_maxid[pos]); 53             } 54         } 55     } 56  57 } 58 void dfs2(int pos,int fa) 59 { 60     for(int i=head[pos]; i!=-1; i=edge[i].next){ 61         int to=edge[i].to; 62         int llen=edge[i].len; 63         if(to==fa) 64             continue; 65         if(to==F_maxid[pos]){ 66             if(S_max[to]<S_max[pos]+llen){ 67                 S_max[to]=S_max[pos]+llen; 68                 S_maxid[to]=pos; 69                 if(S_max[to]>F_max[to]){ 70                 swap(S_max[to],F_max[to]); 71                 swap(S_maxid[to],F_maxid[to]); 72                 } 73             } 74         } 75         else{ 76              if(S_max[to]<F_max[pos]+llen){ 77                 S_max[to]=F_max[pos]+llen; 78                 S_maxid[to]=pos; 79                 if(S_max[to]>F_max[to]){ 80                 swap(S_max[to],F_max[to]); 81                 swap(S_maxid[to],F_maxid[to]); 82                 } 83             } 84         } 85         dfs2(to,pos); 86     } 87 } 88 void solve() 89 { 90     dfs1(1,0); 91     dfs2(1,0); 92     for(int i=1;i<=n;i++) 93         cout<<F_max[i]<<endl; 94 } 95 int main() 96 { 97     while(cin>>n) 98     { 99         memset(head,-1,sizeof(head));100         tol=0;101         for(int i=1; i<n; i++){102             int a,b;103             cin>>a>>b;104             add(i+1,a,b);105         }106         solve();107     }108 }