P1345 [USACO5.4] cow's telecom telecowmunication
Actually, we're asking for some cuts.
We can split a point into two points, with only one and a 1-capacity edge.
Then the minimum cut is asked. Minimum cut equals maximum flow 233
Dinci is OK .
#include <cstdio>#include <algorithm>#include <iostream>#include <cstring>#include <queue>using namespaceStdstructnode{intPointintNxtintWeight;}; Node line[6000];inthead[6000],tail=-1;voidAddintXintYintz) {line[++tail].point=y; Line[tail].weight=z; LINE[TAIL].NXT=HEAD[X]; Head[x]=tail; Line[++tail].point=x; line[tail].weight=0; Line[tail].nxt=head[y]; Head[y]=tail;}intdep[6000];intcur[6000];intN,m,s,t;BOOLBFS (intBeginintEnd) {memset (DEP,0,sizeof(DEP)); queue<int>q; dep[begin]=1; Q.push (begin); for(intI=1; i<=2*n;i++) Cur[i]=head[i]; while(!q.empty ()) {intPas=q.front (); Q.pop (); for(inti=head[pas];i!=-1; i=line[i].nxt)if(Line[i].weight&&!dep[line[i].point]) {Dep[line[i].point]=dep[pas]+1; Q.push (Line[i].point); } }if(Dep[end])return true;return false;}intDFS (intNowintAimintLimte) {if(Now==aim| |! LIMTE)returnLimte;intflow=0, F; for(inti=cur[now];i!=-1; i=line[i].nxt) {cur[now]=i;if(Dep[line[i].point]==dep[now]+1&& (F=dfs (Line[i].point,aim,min (limte,line[i].weight))) {limte-=f; Flow+=f; Line[i].weight-=f; line[i^1].weight+=f;if(!limte) Break; } }returnFlow;}intDinic (intBeginintEnd) {intres=0; while(BFS (Begin,end)) Res+=dfs (Begin,end,0x7fffffff);returnRes;}intMain () {scanf ("%d%d%d%d", &n,&m,&s,&t); for(intI=1; i<=2*n;i++) head[i]=-1; for(intI=1; i<=n;i++) Add (I,i+n,1);intb; for(intI=1; i<=m;i++) {scanf ("%d%d", &a,&b); Add (A+n,b,0x7fffffff); Add (B+n,a,0x7fffffff); } printf ("%d", Dinic (S+n,t));}
P1345 [USACO5.4] cow's telecom telecowmunication