码迷,mamicode.com
首页 > 其他好文 > 详细

HDU1532 Drainage Ditches【最大流】【Edmond-Karp】

时间:2015-02-26 23:03:43      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1532


题目大意:

约翰要修建水沟用来排放农场的雨水,该水沟系统是一个网络流,总共有N条边,M个节点。

1是源点,M是汇点。求最大流是多少。


思路:

同样是网络流求最大流的裸题。直接用Edmond-Karp算法来做就可以了。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN = 220;

int Map[MAXN][MAXN],pre[MAXN];
int N,M;

bool EkBFS(int start,int end)
{
    queue<int> Q;
    bool vis[MAXN];
    memset(vis,false,sizeof(vis));
    memset(pre,-1,sizeof(pre));
    Q.push(start);
    vis[start] = true;

    while(!Q.empty())
    {
        int u = Q.front();
        if(u == end)
            return true;
        Q.pop();

        for(int i = 0; i <= N; ++i)
        {
            if(Map[u][i] && !vis[i])
            {
                vis[i] = true;
                pre[i] = u;
                Q.push(i);
            }
        }
    }
    return false;
}

int EkMaxFlow(int start,int end)
{
    int v,Ans = 0,MinN;
    while(EkBFS(start,end))
    {
        MinN = 0xffffff0;
        v = end;
        while(pre[v] != -1)
        {
            MinN = min(MinN,Map[pre[v]][v]);
            v = pre[v];
        }
        Ans += MinN;
        v = end;
        while(pre[v] != -1)
        {
            Map[pre[v]][v] -= MinN;
            Map[v][pre[v]] += MinN;
            v = pre[v];
        }
    }
    return Ans;
}

int main()
{
    int u,v,w;
    while(~scanf("%d%d",&M,&N)) //转换为M条边,N个节点
    {
        memset(Map,0,sizeof(Map));
        for(int i = 0; i < M; ++i)
        {
            scanf("%d%d%d",&u,&v,&w);
            Map[u][v] += w;
        }
        printf("%d\n",EkMaxFlow(1,N));
    }

    return 0;
}


HDU1532 Drainage Ditches【最大流】【Edmond-Karp】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/43956925

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!