標籤:void post dinic inf bfs pre markdown ++ i++
#include<iostream>#include<cstring>#include<cstdio>#define N 1000005#define inf 0x3f3f3f3fusing namespace std;struct node{ int to,nxt,cap;};int que[N];int h,qt;struct Dinic{ int n,m; int s,t; int tot; int d[N]; int cur[N]; node e[N]; int vis[N]; int head[N]; Dinic(){tot=1;} void add(int f,int t,int c){ e[++tot].to=t; e[tot].nxt=head[f]; e[tot].cap=c; head[f]=tot; e[++tot].to=f; e[tot].nxt=head[t]; e[tot].cap=0; head[t]=tot; } bool bfs(){ memset(vis,false,sizeof(vis)); for(int i=0;i<=n;++i)cur[i]=head[i]; que[qt=1]=s,h=0;int top,to;d[s]=0;vis[s]=1; while(h<qt){ top=que[++h]; for(int i=head[top];i;i=e[i].nxt) if(!vis[e[i].to]&&e[i].cap){ to=e[i].to;que[++qt]=to; vis[to]=true;d[to]=d[top]+1; if(to==t)return true; } } return vis[t]; } int dfs(int x,int fl){ if(x==t)return fl; int flow=0,f; for(int i=cur[x];i;i=e[i].nxt) if(d[e[i].to]==d[x]+1) if(f=dfs(e[i].to,min(fl,e[i].cap))){ e[i].cap-=f; e[i^1].cap+=f; flow+=f;fl-=f; if(fl<=0)break; } if(fl)d[x]=-1; return flow; } int dinic(int s,int t){ this->s=s; this->t=t; int ans=0; while(bfs()) ans+=dfs(s,inf); return ans; }};int n,m,s,t;int main(){ Dinic f; cin>>n>>m>>s>>t;f.n=3*n; for(int i=1;i<=m;i++){ int a,b; cin>>a>>b; f.add(a+n,b,inf);f.add(b,a+n,0); f.add(b+n,a,inf);f.add(a,b+n,0); } for(int i=1;i<=n;i++) f.add(i,i+n,1),f.add(i+n,i,0); cout<<f.dinic(s+n,t)<<endl; return 0;}
P1345 [USACO5.4]奶牛的電信Telecowmunication