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

原文地址:https://www.cnblogs.com/zyfzyf/p/4189767.html