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

Drainage Ditches - poj 1273(网络流模板)

时间:2015-08-07 10:59:46      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:

题意:1是源点,m是汇点,求出来最大流量,没什么好说的就是练习最大流的模板题

**************************************************************

 

先用Edmonds-Karp的算法做一下试试吧
重边贡献了 1W,要加上所有的重边才算是两点间最大流量
*************************************************************************
技术分享
/************************************/
/** 使用Edmonds-Karp 最短增广路算法*/
/** 邻接矩阵实现                   */
/** 2015/8/7/9:39                   */
/************************************/

#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;

const int MAXN = 205;
const int oo = 1e9+7;

///1是源点,M是汇点,N条边
int G[MAXN][MAXN], M, N;
int pre[MAXN];///记录每个点的前驱,也就是父节点
bool used[MAXN];

///s代表源点,e代表汇点,可以到达汇返回true,否则返回false
bool BFS(int s, int e)
{
    memset(used, falsesizeof(used));
    queue<int> Q;
    Q.push(s);
    used[s] = true;

    while(Q.size())
    {
        s = Q.front();Q.pop();

        if(s == e) return true;

        for(int i=1; i<=M; i++)
        {
            if(G[s][i] && !used[i])
            {
                pre[i] = s;
                used[i] = true;
                Q.push(i);
            }
        }
    }

    return false;
}
int Karp(int s, int e)
{
    int MaxFlow = 0;

    while( BFS(s, e) == true )
    {///如果有增量
        int MinFlow = oo, v;

        v = e;

        while(v != s)
        {///求出来路径上最小流量
            MinFlow = min(MinFlow, G[pre[v]][v]);
            v = pre[v];
        }

        MaxFlow += MinFlow;
        v = e;

        while(v != s)
        {///边上的所有点减去最小流量,反边增加流量
            G[pre[v]][v] -= MinFlow;
            G[v][pre[v]] += MinFlow;

            v = pre[v];
        }
    }

    return MaxFlow;
}

int main()
{
    while(scanf("%d%d", &N, &M) != EOF)
    {
        int i, u, v, c;

        memset(G, falsesizeof(G));

        for(i=1; i<=N; i++)
        {
            scanf("%d%d%d", &u, &v, &c);
            G[u][v] += c;///有重边,两点间应该算上所有边
        }

        printf("%d\n", Karp(1, M));
    }

    return 0;
}
View Code

 

Drainage Ditches - poj 1273(网络流模板)

标签:

原文地址:http://www.cnblogs.com/liuxin13/p/4709956.html

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