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 }
  • 相关阅读:
    centos7 rabbitmq系统部署
    socket粘包、断包、校验
    C#对象、文件与二进制串(byte数组)之间的转换
    Windows Error Code
    C#之Socket断线和重连
    BitConverter 整数和十六进制互转
    DateTime还是DateTimeOffset?Now还是UtcNow?
    WebAPI 跨域
    Console Owin 跨域解决
    2019.12.17 Arcgis10.1许可到期解决方法
  • 原文地址:https://www.cnblogs.com/naix-x/p/3260375.html
Copyright © 2011-2022 走看看