您的位置:首页 > 大数据 > 人工智能

hdu 1532 Drainage Ditches(最大流)

2017-04-23 00:49 246 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532

题意:求从1到m的最大流(在下面的代码中n,m互换了)。

解题方案:Edmonds Karp算法求最大流(关于算法中为什么要用反向边,这篇博客给出了很好地解释)。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>

using namespace std;

#define FOR(i,k,n) for(int i=k;i<n;i++)
#define FORR(i,k,n) for(int i=k;i<=n;i++)
#define scan(a) scanf("%d",&a)
#define scann(a,b) scanf("%d%d",&a,&b)
#define scannn(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define mst(a,n)  memset(a,n,sizeof(a))
#define ll long long
#define N 205
#define mod 1000000007
#define INF 0x3f3f3f3f

const double eps=1e-8;
const double pi=acos(-1.0);

int cap

;
int pre
;
int n,m;

int Bfs(int s,int t)
{
mst(pre,-1);
queue<int> q;
pre[s]=s;
q.push(s);
int d=INF;
while(!q.empty())
{
int cur=q.front();
q.pop();
for(int i=1;i<=n;i++)
{
if(pre[i]==-1&&cap[cur][i])//pre数组记录路径的同时也可以用作vis数组进行标记
{
pre[i]=cur;
d=min(d,cap[cur][i]);
if(i==t) return d;
q.push(i);
}
}
}
return 0;
}

int EK(int s,int t)
{
int flow=0,d;
while(d=Bfs(s,t))
{
for(int i=t;i!=s;i=pre[i])
{
cap[pre[i]][i]-=d;
cap[i][pre[i]]+=d;
}
flow+=d;
}
return flow;
}

int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);

while(cin>>m>>n)
{
mst(cap,0);
int u,v,c;
for(int i=0;i<m;i++)
{
cin>>u>>v>>c;
cap[u][v]+=c;//题目输入有重边
}
cout<<EK(1,n)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最大流问题