网络流最大流。
dinic
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
#define inf 0xffffff
int N,M,S;
int edg[250][250];
int dis[250];
int q[2000],h,r;
int BFS()
{
int i,u;
memset(dis,-1,sizeof dis);
dis[1]=0;
queue<int>q;
q.push(1);
while(!q.empty()){
u=q.front();
q.pop();
for(i=1;i<=N;i++)
if(dis[i]<0&&edg[u][i]>0)
{
dis[i]=dis[u]+1;//层次
q.push(i);
}
}
if(dis[N]>0)
return 1;
else return 0;//不能到达汇点
}
int find(int x,int low)
{
int i,t=0;
if(x==N) return low;
for(i=1;i<=N;i++)
if(edg[x][i]>0&&//联通
dis[i]==dis[x]+1&&//是下一层
(t=find(i,min(low,edg[x][i]))))//可以到达汇点
{
edg[x][i]-=t;
edg[i][x]+=t;//反向弧
return t;
}
return 0;
}
int main()
{
while(scanf("%d%d",&M,&N)!=EOF){
memset(edg,0,sizeof edg);
int si,ei,ci,tt;
for(int i=1;i<=M;i++){
scanf("%d%d%d",&si,&ei,&ci);
edg[si][ei]+=ci;
}
S=0;
while(BFS())
{
while(tt=find(1,0xffffff)) S+=tt;
}
printf("%d\n",S);
}
}