如果不在最长路的边,那么肯定是w*最长路。
如果在最长路,那么把最长路分成两段,左边树的最长路就是左段+左边点的次短路(不包含最长路上的点的最长路) ,右边同理。
还有就是更新,经过左端点的最长路,不一定是整颗左边树的最长路,乱搞一下就可以了。我是搞成一条链,写的很麻烦。。从一点搞到了快四点。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <queue> 6 #include <algorithm> 7 using namespace std; 8 #define INF 1000000 9 struct node 10 { 11 int u,v,w,next,id; 12 } edge[200000]; 13 int t,n,first[200001],flag[200001]; 14 int d[100001],in[100001],pre[100001]; 15 int pre1[100001]; 16 int pre2[100001]; 17 int sp1[100001]; 18 int sp2[100001]; 19 int sp3[100001]; 20 int sp4[100001]; 21 int dp[200001]; 22 int qu[100001]; 23 int qv[100001]; 24 int qw[100001]; 25 void CL() 26 { 27 int i; 28 for(i = 0; i <= n; i ++) 29 { 30 first[i] = -1; 31 flag[i] = 0; 32 dp[i] = 0; 33 } 34 t = 1; 35 } 36 void add(int u,int v,int w,int id) 37 { 38 edge[t].u = u; 39 edge[t].v = v; 40 edge[t].w = w; 41 edge[t].next = first[u]; 42 edge[t].id = id; 43 first[u] = t ++; 44 } 45 void dfs(int x) 46 { 47 int i,maxz,v; 48 in[x] = 1; 49 maxz = 0; 50 for(i = first[x]; i != -1; i = edge[i].next) 51 { 52 v = edge[i].v; 53 if(flag[v]||in[v]) continue; 54 in[v] = 1; 55 dfs(v); 56 maxz = dp[v] + 1; 57 } 58 dp[x] = maxz; 59 return; 60 } 61 int spfa(int x) 62 { 63 int u,v,i; 64 for(i = 1; i <= n; i ++) 65 { 66 d[i] = -INF; 67 pre[i] = -1; 68 in[i] = 0; 69 } 70 queue<int>que; 71 que.push(x); 72 in[x] = 1; 73 d[x] = 0; 74 while(!que.empty()) 75 { 76 u = que.front(); 77 que.pop(); 78 for(i = first[u]; i != -1; i = edge[i].next) 79 { 80 v = edge[i].v; 81 if(in[v]) continue; 82 if(d[v] < d[u] + 1) 83 { 84 d[v] = d[u] + 1; 85 pre[v] = u; 86 pre1[v] = i; 87 in[v] = 1; 88 que.push(v); 89 } 90 } 91 } 92 int id,maxz = 0; 93 for(i = 1; i <= n; i ++) 94 { 95 if(maxz < d[i]) 96 { 97 maxz = d[i]; 98 id = i; 99 } 100 } 101 return id; 102 } 103 int main() 104 { 105 int cas,i,u,v,w,a,b,tmax,bb,aa,sn = 1; 106 scanf("%d",&cas); 107 while(cas--) 108 { 109 scanf("%d",&n); 110 CL(); 111 for(i = 1; i < n; i ++) 112 { 113 scanf("%d%d%d",&u,&v,&w); 114 add(u,v,w,i); 115 add(v,u,w,i); 116 qu[i] = u; 117 qv[i] = v; 118 qw[i] = w; 119 } 120 b = spfa(a = spfa(1)); 121 bb = b; 122 aa = a; 123 tmax = d[b]; 124 while(b != a) 125 { 126 flag[b] = 1; 127 pre2[pre[b]] = b; 128 b = pre[b]; 129 } 130 flag[a] = 1; 131 for(i = 1; i <= n; i ++) 132 in[i] = 0; 133 for(i = 1; i <= n; i ++) 134 { 135 if(flag[i]||in[i]) 136 { 137 dfs(i); 138 } 139 } 140 int minz = INF,num,res = -1; 141 b = bb; 142 num = 0; 143 while(1) 144 { 145 sp1[b] = dp[b]+tmax - num; 146 sp2[b] = num + dp[b]; 147 num ++; 148 if(a == b) break; 149 b = pre[b]; 150 } 151 int pos = 0; 152 b = bb; 153 a = aa; 154 while(b != a) 155 { 156 sp2[pre[b]] = max(pos,sp2[pre[b]]); 157 pos = sp2[pre[b]]; 158 b = pre[b]; 159 } 160 b = bb; 161 a = aa; 162 pos = 0; 163 while(a != b) 164 { 165 sp1[pre2[a]] = max(pos,sp1[pre2[a]]); 166 pos = sp1[pre2[a]]; 167 a = pre2[a]; 168 } 169 b = bb; 170 a = aa; 171 for(i = 1; i < n; i ++) 172 { 173 if(flag[qu[i]]&&flag[qv[i]]) 174 { 175 if(pre[qu[i]] == qv[i]) 176 { 177 u = qu[i]; 178 v = qv[i]; 179 } 180 else 181 { 182 u = qv[i]; 183 v = qu[i]; 184 } 185 int tt = qw[i]*(max(sp1[v],sp2[u])); 186 if(minz > tt) 187 { 188 minz = tt; 189 res = i; 190 } 191 else if(minz == tt) 192 { 193 res = min(res,i); 194 } 195 } 196 else 197 { 198 if(minz > qw[i]*tmax) 199 { 200 minz = qw[i]*tmax; 201 res = i; 202 } 203 else if(minz == qw[i]*tmax) 204 { 205 res = min(res,i); 206 } 207 } 208 } 209 printf("Case #%d: %d ",sn++,res); 210 } 211 return 0; 212 }