HDU 4679 Terrorist’s destroy

如果不在最长路的边,那么肯定是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\n",sn++,res);
210     }
211     return 0;
212 }

 

posted @ 2013-08-15 18:23  Naix_x  阅读(370)  评论(0编辑  收藏  举报