zoukankan      html  css  js  c++  java
  • NOIP2015BLOCKADE c++ 代码

      1 #include<algorithm>
      2 #include<fstream>
      3 #include<functional>
      4 #include<iostream>
      5 using namespace std;
      6 static const int N=50001;
      7 typedef long long int64;
      8 struct node
      9 {
     10     int v,w;
     11     node *next;
     12 }alist[3*N];
     13 struct heapnode
     14 {
     15     int64 w;
     16     int u;
     17     bool operator>(const heapnode &r)const 
     18     {
     19         return w>r.w;
     20     }
     21 };
     22 int p[N][19];
     23 int64 w[N][19];
     24 void dfs1(int u)
     25 {
     26     for(node *i=alist[u].next;i;i=i->next)
     27         if(i->v!=p[u][0])
     28         {
     29             p[i->v][0]=u;
     30             w[i->v][0]=i->w;
     31             dfs1(i->v);
     32         }
     33 }
     34 bool visit[N];
     35 void dfs2(int u)
     36 {
     37     if(visit[u])return;
     38     if(!alist[u].next->next)return;
     39     visit[u]=true;
     40     for(node *i=alist[u].next;i;i=i->next)
     41         if(i->v!=p[u][0])
     42         {
     43             dfs2(i->v);
     44             if(!visit[i->v])
     45             {
     46                 visit[u]=false;
     47                 break;
     48             }
     49         }
     50 }
     51 int main()
     52 {
     53     ifstream fin("blockade.in");
     54     ofstream fout("blockade.out");
     55     int n(0),m(0);
     56     fin>>n;
     57     node *anode(alist+n+1);
     58     for(int i=0;i<n-1;i++)
     59     {
     60         int u(0),v(0),ww(0);
     61         fin>>u>>v>>ww;
     62         anode->v=v;
     63         anode->w=ww;
     64         anode->next=alist[u].next;
     65         alist[u].next=anode++;
     66         anode->v=u;
     67         anode->w=ww;
     68         anode->next=alist[v].next;
     69         alist[v].next=anode++;
     70     }
     71     fin>>m;
     72     static int d[N];
     73     for(int i=0;i<m;i++)
     74         fin>>d[i];
     75     int NScount=0;
     76     for(node *i=alist[1].next;i;i=i->next)
     77     {
     78         NScount++;
     79         p[i->v][0]=1;
     80         w[i->v][0]=i->w;
     81         dfs1(i->v);
     82     }
     83     if(NScount>m)
     84     {
     85         fout<<"-1"<<endl;
     86         return 0;
     87     }
     88     for(int j=1;j<=18;j++)
     89         for(int i=1;i<=n;i++)
     90         {
     91             p[i][j]=p[p[i][j-1]][j-1];
     92             w[i][j]=w[i][j-1]+w[p[i][j-1]][j-1];
     93         }
     94     static heapnode a[N],b[N];
     95     heapnode *atop(0),*aback(0),*btop(0),*bback(0);
     96     static int _w[N];
     97     for(node *i=alist[1].next;i;i=i->next)
     98         _w[i->v]=i->w;
     99     int64 l(0),r(1e16),ans(1e16);
    100     greater<heapnode> comp;
    101     while(l<=r)
    102     {
    103         atop=a;
    104         aback=a;
    105         btop=b;
    106         bback=b;
    107         int64 mm=(l+r)>>1;
    108         for(int i=1;i<=n;i++)
    109             visit[i]=false;
    110         for(int i=0;i<m;i++)
    111         {
    112             int u=d[i];
    113             int64 ww=mm;
    114             for(int j=18;j>=0;j--)
    115                 if(p[u][j]&&p[u][j]!=1&&ww>=w[u][j])
    116                 {
    117                     ww-=w[u][j];
    118                     u=p[u][j];
    119                 }
    120             if(/*p[u][0]==1&&*/ww>w[u][0])
    121             {
    122                 aback->w=ww-w[u][0];
    123                 aback->u=u;
    124                 aback++;
    125                 push_heap(atop,aback,comp);
    126             }
    127             else visit[u]=true;
    128         }
    129         dfs2(1);
    130         if(visit[1])
    131         {
    132             ans=mm;
    133             r=mm-1;
    134         }
    135         else
    136         {
    137             for(node *i=alist[1].next;i;i=i->next)
    138                 if(!visit[i->v])
    139                 {
    140                     bback->w=i->w;
    141                     bback->u=i->v;
    142                     bback++;
    143                     push_heap(btop,bback,comp);
    144                 }
    145             while(btop!=bback||atop!=aback)
    146             {
    147                 while(atop!=aback&&!visit[atop->u]&&atop->w<_w[atop->u])
    148                 {
    149                     visit[atop->u]=true;
    150                     pop_heap(atop,aback,comp);
    151                     aback--;
    152                 }
    153                 while(btop!=bback&&visit[btop->u])
    154                 {
    155                     pop_heap(btop,bback,comp);
    156                     bback--;
    157                 }
    158                 if(btop==bback||atop==aback)break;
    159                 if(atop->w>=btop->w)
    160                 {
    161                     visit[btop->u]=true;
    162                     pop_heap(atop,aback,comp);
    163                     aback--;
    164                     pop_heap(btop,bback,comp);
    165                     bback--;
    166                 }
    167                 else
    168                 {
    169                     pop_heap(atop,aback,comp);
    170                     aback--;
    171                 }
    172             }
    173             if(btop==bback)
    174             {
    175                 ans=min(ans,mm);
    176                 r=mm-1;
    177             }
    178             else l=mm+1;
    179         }
    180     }
    181     fout<<ans<<endl;
    182     return 0;
    183 }
  • 相关阅读:
    令人惊艳的算法——蒙特卡洛采样法
    肺炎确诊人数增长趋势拟合和预测(截止1月28日)
    「07」回归的诱惑:深入浅出逻辑回归
    实现一个简易版Webpack
    nrm——快速切换npm源
    7个有用的JavaScript技巧
    JSON Web Token 是什么?
    【译】强化表单的9个Vue输入库
    【译】如何使用Vue过渡效果来提升用户体验
    【译】JavaScript Source Maps浅析
  • 原文地址:https://www.cnblogs.com/JebediahKerman/p/6001421.html
Copyright © 2011-2022 走看看