hdu 1532 Drainage Ditches(最大流)

来源:互联网 发布:js替换图片路径 编辑:程序博客网 时间:2024/06/05 19:25

题目链接: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 0x3f3f3f3fconst double eps=1e-8;const double pi=acos(-1.0);int cap[N][N];int pre[N];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;}


0 0
原创粉丝点击