最大流dinic模板
#include<cstdio> #include<string.h> #include<algorithm> #include<math.h> #include<queue> using namespace std; const int maxn=1000; const int inf=0x3f3f3f3f; int head[maxn],level[maxn]; int num; void init() { num=-1 ; memset(head,-1,sizeof(head)); } struct node { int v,w,next; }G[400000]; int bfs(int s,int t) { queue<int>q; q.push(s); memset(level,-1,sizeof(level)); level[s]=0; while(!q.empty()){ int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=G[i].next){ int v=G[i].v; if(G[i].w>0&&level[v]==-1){ level[v]=level[u]+1; q.push(v); } } } return level[t]; } int dfs(int s,int t,int f) { if(s==t) return f; int ans=0; for(int i=head[s];i!=-1;i=G[i].next){ int v=G[i].v; if(G[i].w>0&&level[s]+1==level[v]){ int d=dfs(v,t,min(G[i].w,f-ans)); if(d>0){ G[i].w-=d; G[i^1].w+=d; ans+=d; if(ans==f) return ans; } } } return ans; } int dinic(int s,int t) { int ans=0; while(1){ int temp=bfs(s,t); if(temp==-1) break; ans+=dfs(s,t,inf); } return ans; } void build(int u,int v,int w) { num++; G[num].v=v; G[num].w=w; G[num].next=head[u]; head[u]=num; num++; G[num].v=u; G[num].w=0; G[num].next=head[v]; head[v]=num; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF){ init(); int s,t; scanf("%d%d",&s,&t); t=t+n; int temp; for(int i=1;i<=n;i++){ scanf("%d",&temp); build(i,i+n,temp); } for(int i=1;i<=m;i++){ int u;int v; scanf("%d%d",&u,&v); build(u+n,v,inf); build(v+n,u,inf); } printf("%d\n",dinic(s,t)); } return 0; }
t