zoukankan      html  css  js  c++  java
  • 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
    ",sn++,res);
    210     }
    211     return 0;
    212 }
  • 相关阅读:
    SGU 176.Flow construction (有上下界的最大流)
    POJ 2391.Ombrophobic Bovines (最大流)
    poj 1087.A Plug for UNIX (最大流)
    poj 1273.PIG (最大流)
    POJ 2112.Optimal Milking (最大流)
    SGU 196.Matrix Multiplication
    SGU 195. New Year Bonus Grant
    关于multicycle path
    ppt做gif动图
    codeforces 598A Tricky Sum
  • 原文地址:https://www.cnblogs.com/naix-x/p/3260375.html
Copyright © 2011-2022 走看看