网络流
不介绍原理。
例题一:P3376 【模板】网络最大流
模板。代码如下:
#include<bits/stdc++.h> using namespace std; const int maxn=500000; int beg[maxn],nex[maxn],to[maxn],w[maxn],e; inline void add(int x,int y,int z){ nex[e]=beg[x];beg[x]=e; to[e]=y;w[e]=z;e++; } int n,m,s,t,flow,dep[maxn]; queue<int>q; inline int bfs(int x,int y){ memset(dep,0x3f,sizeof(dep)); while(!q.empty())q.pop(); dep[x]=0; q.push(x); while(!q.empty()){ int t=q.front(); q.pop(); for(int i=beg[t];~i;i=nex[i]) if(dep[to[i]]>n&&w[i]){ dep[to[i]]=dep[t]+1; q.push(to[i]); } } return dep[y]<n; } int dfs(int x,int y,int lim){ if(!lim||x==y)return lim; int ans=0; for(int i=beg[x];~i;i=nex[i]) if(dep[to[i]]==dep[x]+1){ int f=dfs(to[i],y,min(lim,w[i])); ans+=f;w[i]-=f;w[i^1]+=f;lim-=f; } return ans; } inline void dinic(int x,int y){ while(bfs(x,y))flow+=dfs(x,y,2147483647); } int main(){ memset(beg,-1,sizeof(beg)); cin>>n>>m>>s>>t; int x,y,z; for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,0); } dinic(s,t); printf("%d\n",flow); return 0; }