zoukankan      html  css  js  c++  java
  • BZOJ3258: 秘密任务

    题解:

    其实就是一个简单的最小割判断是否唯一解。。。

    可是我写了一上午还没过。。。T_T

    把1-n的最短路上的边提出来做最小割。

    然后从s,t分别bfs判断必须在某个割的点。如果有的点没有被bfs到,那么最小割方案不为1。

    因为s到它的边满流,它到t的边也满流,哪条边都可以作为割边。

    但还是有很多坑点啊!!!一条路两端的权值相同。。。

    现在还没过。。。

    代码:

      1 #include<cstdio>
      2 #include<cstdlib>
      3 #include<cmath>
      4 #include<cstring>
      5 #include<algorithm>
      6 #include<iostream>
      7 #include<vector>
      8 #include<map>
      9 #include<set>
     10 #include<queue>
     11 #include<string>
     12 #define inf 1000000000
     13 #define maxn 100000
     14 #define maxm 100000
     15 #define eps 1e-10
     16 #define ll long long
     17 #define pa pair<int,int>
     18 #define for0(i,n) for(int i=0;i<=(n);i++)
     19 #define for1(i,n) for(int i=1;i<=(n);i++)
     20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
     21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
     22 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
     23 #define mod 1000000007
     24 using namespace std;
     25 inline int read()
     26 {
     27     int x=0,f=1;char ch=getchar();
     28     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     29     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
     30     return x*f;
     31 }
     32 int  n,m,s,t,maxflow,tot=1,a[maxn],u[maxn],v[maxn],w[maxn],head[maxn],cur[maxn],h[maxn];
     33 queue<int>q;
     34 ll d[2][maxn];
     35 bool vv[maxn],can[maxn];
     36 struct edge{int go,next,v;}e[maxm];
     37 void add(int x,int y,int v)
     38 {
     39     cout<<x<<' '<<y<<' '<<v<<endl;
     40     e[++tot]=(edge){y,head[x],v};head[x]=tot;
     41     e[++tot]=(edge){x,head[y],0};head[y]=tot;
     42 }
     43 void add2(int x,int y,int v)
     44 {
     45     e[++tot]=(edge){y,head[x],v};head[x]=tot;
     46     e[++tot]=(edge){x,head[y],v};head[y]=tot;
     47 }
     48 bool bfs()
     49 {
     50     for(int i=s;i<=t;i++)h[i]=-1;
     51     q.push(s);h[s]=0;
     52     while(!q.empty())
     53     {
     54         int x=q.front();q.pop();
     55         for(int i=head[x];i;i=e[i].next)
     56          if(e[i].v&&h[e[i].go]==-1)
     57          {
     58             h[e[i].go]=h[x]+1;q.push(e[i].go);
     59          }
     60     }
     61     return h[t]!=-1;
     62 }
     63 int dfs(int x,int f)
     64 {
     65     if(x==t) return f;
     66     int tmp,used=0;
     67     for(int i=cur[x];i;i=e[i].next)
     68      if(e[i].v&&h[e[i].go]==h[x]+1)
     69     {
     70         tmp=dfs(e[i].go,min(e[i].v,f-used));
     71         e[i].v-=tmp;if(e[i].v)cur[x]=i;
     72         e[i^1].v+=tmp;used+=tmp;
     73         if(used==f)return f;       
     74     }
     75     if(!used) h[x]=-1;
     76     return used;
     77 }
     78 void dinic()
     79 {
     80     maxflow=0;
     81     while(bfs())
     82     {
     83         for (int i=s;i<=t;i++)cur[i]=head[i];maxflow+=dfs(s,inf);
     84     }
     85 }
     86 inline void dfss(int k,int x)
     87 {
     88     can[x]=1;
     89     cout<<"AAAAA "<<x<<endl;
     90     for4(i,x)if(e[i^k].v&&!can[y])dfss(k,y);
     91 }
     92 void spfa(int k,int s)
     93 {
     94     for (int i=1;i<=n;i++){vv[i]=0;d[k][i]=inf;}
     95     q.push(s);d[k][s]=0;vv[s]=1;
     96     while(!q.empty())
     97     {
     98         int x=q.front();q.pop();vv[x]=0;
     99         for (int i=head[x],y;i;i=e[i].next)
    100          if(e[i].v&&d[k][x]+(ll)e[i].v<d[k][y=e[i].go])
    101          {
    102             d[k][y]=d[k][x]+(ll)e[i].v;
    103             if(!vv[y]){vv[y]=1;q.push(y);}
    104          }
    105     }
    106 }
    107 int main()
    108 {
    109     freopen("input.txt","r",stdin);
    110     freopen("output.txt","w",stdout);
    111     int T=read();
    112     while(T--)
    113     {
    114         n=read();m=read();
    115         for1(i,n-1)a[i]=read();a[n]=inf;
    116         memset(head,0,sizeof(head));tot=0;
    117         for1(i,m){u[i]=read();v[i]=read();w[i]=read();add2(u[i],v[i],w[i]);}
    118         spfa(0,1);spfa(1,n);
    119         memset(head,0,sizeof(head));tot=1;
    120         for1(i,m)
    121         {
    122             if(d[0][u[i]]+w[i]+d[1][v[i]]==d[0][n])add(u[i],v[i],min(a[u[i]],a[v[i]]));
    123             if(d[0][v[i]]+w[i]+d[1][u[i]]==d[0][n])add(v[i],u[i],min(a[u[i]],a[v[i]]));
    124         }
    125         s=1;t=n;
    126         dinic();
    127         memset(can,0,sizeof(can));
    128         dfss(0,s);dfss(1,t);
    129         bool flag=0;
    130         for1(i,n)for4(j,i)
    131         {
    132           cout<<i<<' '<<e[j].v<<' '<<e[j].go<<' '<<can[e[j].go]<<' '<<a[i]<<' '<<a[e[j].go]<<endl;
    133           if((j&1)==0&&e[j].v==0&&a[i]==a[e[j].go])flag=1;
    134           if(!can[e[j].go])flag=1;
    135         }
    136         printf("%s %d
    ",flag?"No":"Yes",maxflow);
    137     }    
    138     return 0;
    139 }
    View Code

    卡掉我的数据

    77 182
    379144 698428 938640 388960 540949 364019 923498 161083 379161 546263 67508 946028 763144 666174 774392 522287 160432 823294 541850 474678 933172 502667 320829 436050 397761 539493 411093 703802 730697 409152 880392 352439 615122 673569 419734 973775 671533 72899 333380 323169 860351 929091 765259 745904 432060 601993 620743 327315 253111 300079 401670 292384 846512 692952 80569 320062 374591 249920 359805 201500 688319 391428 223128 42918 350254 437724 880443 257608 426985 809968 573136 566946 925304 488503 464726 273522 
    70 76 509135
    23 12 230840
    71 44 928258
    70 38 195847
    60 15 364228
    5 8 915543
    14 9 655721
    66 74 80599
    39 15 825467
    75 28 770069
    62 17 868306
    77 39 716392
    22 45 640011
    29 31 738992
    35 68 490817
    69 66 210982
    7 24 799906
    43 15 740172
    23 76 569033
    44 62 905530
    63 45 363251
    64 25 70752
    40 37 28156
    34 62 844478
    71 52 234903
    77 41 434430
    38 4 510383
    8 71 589765
    47 63 211829
    21 60 517740
    12 10 498696
    25 70 646282
    45 69 297256
    35 19 166527
    39 76 167911
    54 75 349128
    47 38 95253
    62 76 702234
    58 63 908625
    63 53 391064
    11 38 98147
    37 15 6049
    40 6 710270
    60 30 763438
    9 28 746782
    62 6 14429
    22 61 434869
    49 20 476382
    27 14 44611
    48 69 442211
    55 43 872512
    11 27 631703
    63 44 22138
    48 21 889610
    27 12 540629
    43 23 970963
    21 42 488002
    10 55 151960
    59 19 189978
    29 38 985063
    29 77 853749
    1 2 142570
    1 3 629206
    1 4 570640
    1 7 63272
    1 13 516714
    1 16 852235
    1 18 140947
    1 19 188835
    1 20 802482
    1 26 206273
    1 32 457001
    1 33 545140
    1 36 370152
    1 46 346429
    1 50 824795
    1 51 544873
    1 56 939509
    1 57 818224
    1 65 532932
    1 67 634313
    1 72 665997
    1 73 989787
    1 61 2699692
    72 41 2438741
    69 8 879654
    67 62 1681460
    25 77 747156
    19 75 3839221
    41 17 79341
    67 20 168169
    46 70 930441
    33 38 535883
    8 42 940169
    69 12 302890
    19 69 1859777
    16 42 3016200
    2 51 402303
    20 40 2011106
    50 6 1505407
    51 45 1206483
    32 69 1591611
    11 21 2201263
    2 4 428070
    20 75 3225574
    32 20 345481
    4 57 247584
    11 9 1332035
    9 42 1357230
    20 27 1008391
    73 54 3387397
    33 3 84066
    77 43 655693
    35 77 2314946
    73 44 420456
    51 66 1714721
    65 38 548091
    32 31 2348077
    62 48 175050
    36 5 3473657
    68 39 1107737
    67 29 1431773
    36 41 2734586
    33 47 631136
    4 49 708224
    36 13 146562
    60 17 40468
    56 60 2204102
    57 34 2342027
    16 48 1638588
    20 70 474388
    35 61 2470874
    64 31 811174
    1 48 2364279
    53 28 1478818
    49 45 472492
    33 12 1806362
    70 9 1234335
    9 30 1395844
    62 21 1064660
    13 10 2333484
    56 25 983643
    33 20 257342
    7 56 876237
    41 28 153249
    68 58 1450551
    14 17 1328595
    26 53 1572896
    1 51 418329
    70 29 789216
    32 45 1294355
    58 5 1547079
    46 37 2439003
    26 3 422933
    3 76 1156799
    14 15 923899
    27 55 1191285
    39 29 112170
    23 40 458550
    67 73 355474
    73 60 2153824
    70 53 502299
    18 43 3185054
    53 54 2598015
    37 42 1083003
    3 64 1364698
    68 15 1933204
    49 28 1979123
    9 15 268178
    2 15 2636813
    57 17 2365855
    27 60 1332738
    18 71 2197554
    76 39 167911
    20 41 2302256
    2 31 2662508
    3 53 1149963
    59 24 484365
    50 60 2318816
    64 42 1874531
    59 50 445982
    68 24 16999
    View Code

    输出应该是yes,但我是no。输出结果显示68不会被bfs到。T_T

  • 相关阅读:
    数据结构
    类加载器介绍
    算法复杂度
    PHP代码审计分段讲解(5)
    PHP代码审计分段讲解(4)
    SQLMap使用指北
    PHP代码审计分段讲解(3)
    PHP代码审计分段讲解(1)
    Nmap学习使用指南
    Python Flask后端异步处理(三)
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4189767.html
Copyright © 2011-2022 走看看