题目链接:http://poj.org/problem?id=1273
这是一道网络流的入门题,用来理解最大流很好。
这个题目我是看的bin神专门为我们这些歌渣渣写的最大流入门博客学的;可以去膜拜一下。链接:http://www.cnblogs.com/kuangbin/archive/2011/07/26/2117636.html (里面的几张图看起来很凌乱的样子,主要看代码就好了。。。)
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<map>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<vector>
#include<algorithm>
#define LL long long
#define inf 1<<29
#define s(a) scanf("%d",&a)
#define CL(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=205;
int n,m,u,v,cost;
int Map[N][N],path[N],flow[N];
int start,endd;
queue<int>q;
int bfs()
{
while(!q.empty()) q.pop();
CL(path,-1);
path[start]=0,flow[start]=inf; // 起始容量为inf;
q.push(start);
while(!q.empty()){
int t=q.front();
q.pop();
if(t==endd) break;
for(int i=1;i<=m;i++){ // 遍历可走路径;
if(i!=start&&path[i]==-1&&Map[t][i]){ // 符合这三种情况表示该路径可走;
flow[i]=flow[t]<Map[t][i]?flow[t]:Map[t][i];
q.push(i);
path[i]=t;
}
}
}
if(path[endd]==-1) return -1; // 说明没有找到可走路径,返回-1;
return flow[endd]; // 找到一条路径之后的增流量;
}
int Edmonds_Karp()
{
int max_flow=0,step,now,pre;
while((step=bfs())!=-1){ // 找不到路径之后便退出;
max_flow+=step; // 累加流量;
now=endd;
while(now!=start){ // 将找到的路径进行反向处理,并更新实际容量;
pre=path[now];
Map[pre][now]-=step; // 更新正向边的实际容量;
Map[now][pre]+=step; // 添加反向边;
now=pre;
}
}
return max_flow;
}
int main()
{
while(~scanf("%d%d",&n,&m)){
CL(Map,0);
for(int i=0;i<n;i++){
scanf("%d%d%d",&u,&v,&cost);
Map[u][v]+=cost; // 为防止一条边不止一次输入;
}
start=1,endd=m;
printf("%d\n",Edmonds_Karp());
}
return 0;
}