详细介绍自行百度 下面是两个模板
都是poj1273模板题
1.E_K 增广路算法
//http://poj.org/status
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int N=205;
const int inf=1<<29;
int n,m,sum;
int s,t;
int cap[N][N],fa[N],flow[N][N],a[N];
void E_K(){
queue<int>q;
while(1){
memset(a,0,sizeof(a));
a[s]=inf;
q.push(s);
while(!q.empty()){
int k=q.front();q.pop();
for(int i=1;i<=m;i++){
if(cap[k][i]>flow[k][i]&&!a[i]){
a[i]=min(a[k],cap[k][i]-flow[k][i]);
fa[i]=k;
q.push(i);
}
}
}
if(!a[m]) break;
sum+=a[m];
for(int i=m;i!=s;i=fa[i]){
flow[fa[i]][i]+=a[m];
flow[i][fa[i]]-=a[m];
}
}
printf("%d\n",sum);
}
int main(){
int u,v,w;
while(scanf("%d%d",&n,&m)!=EOF){
s=1;t=m;sum=0;
memset(flow,0,sizeof(flow));
memset(cap,0,sizeof(cap));
while(n--){
scanf("%d%d%d",&u,&v,&w);
cap[u][v]+=w;
}
E_K();
}
return 0;
}
2.dinic算法 时间复杂度大大小于EK
//poj1273
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define N 2005
#define inf 1<<29
using namespace std;
int n,m;
struct node{
int to,next,w;
}e[N];
int cnt;int head[N],d[N];int start=1,end;
void insert(int x,int y,int z){
e[cnt].to=y;e[cnt].next=head[x];e[cnt].w=z;head[x]=cnt;cnt++;
}
queue<int>q;
bool bfs(){//bfs建图 分层
q.push(start);
memset(d,-1,sizeof(d));
d[start]=0;
while(!q.empty()){
int k=q.front();q.pop();
for(int i=head[k];i!=-1;i=e[i].next){
int kk=e[i].to;
if(d[kk]==-1&&e[i].w>0){
d[kk]=d[k]+1;
q.push(kk);
}
}
}
if(d[end]==-1) return 0;
return 1;
}
int dfs(int x,int mn){
if(x==end) return mn;
for(int i=head[x];i!=-1;i=e[i].next){
int k=e[i].to;
int a=0;
if(d[k]==d[x]+1&&e[i].w>0&&(a=dfs(k,min(e[i].w,mn))))
{
e[i].w-=a;
e[i^1].w+=a;//边从0开始 去的边是0,2,4.. 回的边是1,3,5... 就是异或的结果
return a;//找到就回带
}
}
return 0;//找不到 return 0
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
cnt=0;
memset(head,-1,sizeof(head));
start=1;end=m;
int ans=0;
int u,v,w;
while(n--){
scanf("%d%d%d",&u,&v,&w);
insert(u,v,w);
insert(v,u,0);//反向边 为0!!!
}
while(bfs()){
int mn=inf;int a;
while(a=dfs(start,mn))//a=0就退出
ans+=a;
}
printf("%d\n",ans);
}
}