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\n",flag?"No":"Yes",maxflow); 137 } 138 return 0; 139 }
卡掉我的数据
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
输出应该是yes,但我是no。输出结果显示68不会被bfs到。T_T