题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532
一星期没做题了,调养过度。第一道增广路留念。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define INT_MAX 214748364
#define maxn 205
using namespace std;
int map[maxn][maxn],pre[maxn],n;
bool EK_BFS(int start,int end)
{
queue<int>que;
bool flag[maxn];
memset(flag,0,sizeof(flag));
memset(pre,-1,sizeof(pre));
que.push(start);
flag[start]=1;
while(!que.empty())
{
int e=que.front();
if(e==end) return true;
que.pop();
for(int i=1;i<=n;i++)
if(map[e][i]&&!flag[i])
{
pre[i]=e;
flag[i]=1;
que.push(i);
}
}
return false;
}
int EK(int start,int end)
{
int u,flow_ans=0,mn;
while(EK_BFS(start,end))///增广成功
{
mn=INT_MAX;
u=end;
while(pre[u]!=-1)///寻找边上的最小容量
{
mn=min(mn,map[pre[u]][u]);
u=pre[u];
}
flow_ans+=mn;
u=end;
while(pre[u]!=-1)///修改路径上的边容量
{
map[pre[u]][u]-=mn;
map[u][pre[u]]+=mn;
u=pre[u];
}
}
return flow_ans;
}
int main()
{
int m;
while(~scanf("%d%d",&m,&n))
{
memset(map,0,sizeof(map));
while(m--)
{
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
map[a][b]+=v;
}
printf("%d\n",EK(1,n));
}
return 0;
}