Time Limit: 1000/1000 MS
(Java/Others) Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 2679 Accepted
Submission(s): 1373
5
1 2
2 3
2 4
2 1
answer:6 4 7 7 5
8
5 3
5 3
6 2
1 3
5 4
6 1
6 7
answer: 14 14 14 9 11 7 8 14
题意:求一棵树中,任一点到树中所有点的最长距离。
思路:...待续
1 #include<iostream> 2 #include<stdio.h> 3 #include<vector> 4 #include<cstring> 5 #include<cstdlib> 6 #include<algorithm> 7 #include<queue> 8 using namespace std; 9 10 vector<int>Q[10002]; 11 vector<int>val[10002]; 12 queue<int>H; 13 bool use[10002]; 14 int num[10002]; 15 int dp[10002][2]; 16 int hxl[10002],hlen,flag; 17 18 void add(int x,int y,int len) 19 { 20 Q[x].push_back(y); 21 val[x].push_back(len); 22 num[x]++; 23 } 24 int Max(int x,int y) 25 { 26 return x>y? x:y; 27 } 28 void dfs(int k) 29 { 30 int i,t,cur=0; 31 use[k]=true; 32 for(i=0;i<num[k];i++) 33 { 34 t=Q[k][i]; 35 if(use[t]==true) continue; 36 dfs(t); 37 if( dp[k][0]<=dp[t][0]+val[k][i]) 38 { 39 dp[k][1]=dp[k][0]; 40 dp[k][0]=dp[t][0]+val[k][i]; 41 } 42 else if( dp[k][1]<dp[t][0]+val[k][i] ) 43 { 44 dp[k][1]=dp[t][0]+val[k][i]; 45 } 46 } 47 } 48 void bfs(int n) 49 { 50 int k,t,i,tmp; 51 H.push(n); 52 use[n]=true; 53 while(!H.empty()) 54 { 55 k=H.front(); 56 H.pop(); 57 for(i=0;i<num[k];i++) 58 { 59 t=Q[k][i]; 60 if(use[t]==true) continue; 61 use[t]=true; 62 if(dp[t][0] == dp[k][0]-val[k][i]) 63 { 64 tmp=dp[k][1]+val[k][i]; 65 if(dp[t][0]<=tmp) 66 { 67 dp[t][1]=dp[t][0]; 68 dp[t][0]=tmp; 69 } 70 else if(dp[t][1]<tmp) 71 dp[t][1]=tmp; 72 } 73 else 74 { 75 dp[t][1]=dp[t][0]; 76 dp[t][0]=dp[k][0]+val[k][i]; 77 } 78 H.push(t); 79 } 80 } 81 } 82 void solve(int n) 83 { 84 int i; 85 dfs(1); 86 if(hlen==1) hxl[++hlen]=0; 87 sort(hxl+1,hxl+1+hlen); 88 memset(use,false,sizeof(use)); 89 bfs(1); 90 for(i=1;i<=n;i++) 91 printf("%d\n",dp[i][0]); 92 } 93 int main() 94 { 95 int n,i,x,length; 96 while(scanf("%d",&n)>0) 97 { 98 for(i=0;i<=n;i++) 99 { 100 Q[i].clear(); 101 val[i].clear(); 102 } 103 memset(dp,0,sizeof(dp)); 104 memset(use,false,sizeof(use)); 105 memset(num,0,sizeof(num)); 106 memset(hxl,0,sizeof(hxl)); 107 for(i=2;i<=n;i++) 108 { 109 scanf("%d%d",&x,&length); 110 add(i,x,length); 111 add(x,i,length); 112 } 113 hlen=0; 114 flag=-1; 115 solve(n); 116 } 117 return 0; 118 }
hdu 2196 computer,布布扣,bubuko.com
原文:http://www.cnblogs.com/tom987690183/p/3598303.html