Advertising:
#include <stdio.h>int main(){ puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44099255");}
Exercises
Enumeration takes a few days, and then every day a new layer of points to run the maximum flow to see if maxflow offerings.
Code:
#include <queue>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define P#define N 5010#define M 1001000#define INF 0x3f3f3f3f/*2 <= N <= 501 <= M <= 24501 <= T <= 501 <= x, y <= NX! = Y1 <= Z <= 50*/using namespace STD;structksd{intV,len,next;} E[M];inthead[n],cnt;intru[2500],rv[2500],rl[2500];inline voidAddintUintVintLen) {e[++cnt].v=v; E[cnt].len=len; E[cnt].next=head[u]; head[u]=cnt;}inline voidADD (intUintVintLen) {Add (U,v,len), add (V,u,0);}intS,t,d[n]; Queue<int>QBOOLBFS () { while(!q.empty ()) Q.pop ();memset(d,0,sizeofD);intI,u,v; Q.push (s), d[s]=1; while(!q.empty ()) {U=q.front (), Q.pop (); for(I=head[u];i;i=e[i].next) {if(!d[v=e[i].v]&&e[i].len) {d[v]=d[u]+1;if(v==t)return 1; Q.push (v); } } }return 0;}intDinic (intXintFlow) {if(x==t)returnFlowintRemain=flow,i,v,k; for(I=head[x];i&&remain;i=e[i].next) {if(d[v=e[i].v]==d[x]+1&&e[i].len) {k=dinic (V,min (Remain,e[i].len));if(!k) d[v]=0; e[i].len-=k,e[i^1].len+=k; Remain-=k; } }returnFlow-remain;}intN,m,p,maxflow;intid[ the][p],num;voidBuildintP) {intI,j,k; for(i=1; i<=n;i++) Add (id[p-1][i],id[p][i]=++num,inf); for(i=1; i<=m;i++) Add (id[p-1][ru[i]],id[p][rv[i]],rl[i]); ADD (Id[p][n],t,inf);}intMain () {Freopen ("Test.in","R", stdin);intI,j,k;intA,b,c;scanf("%d%d%d", &n,&m,&p), cnt=1;if(n==1) {puts("0");return 0; } s=0, t=num=1, Add (S,2, p); for(i=1; i<=m;i++)scanf("%d%d%d", &ru[i],&rv[i],&rl[i]); for(i=1; i<=n;i++) id[1][i]=++num; for(i=2; i<=n+p;i++) {build (i); while(BFS ())) maxflow+=dinic (S,inf);if(maxflow==p) {printf("%d\n", I-1);return 0; } }puts("-1");return 0;}
"BZOJ1570" "JSOI2008" Blue Mary's Travel maximum flow check