【第22期】观点:IT 行业加班,到底有没有价值?

最大流模板1

原创 2016年08月30日 17:18:09
杭电3549就是一道最经典的最大流问题,基本上就是套模板。输入两个数 点数M 路径数N,然后输入N行。每行有三个数x,y,z。分别代表头结点尾节点和路径长度。 网络流是个有向图。


下是最大流问题的KM算法,通过反复找增广路径来获得最大流量。

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#define INF 0x7f7f7f7f
using namespace std;
int flow[205][205]/*记录路径流*/, cap[205][205]/*路径的容量*/, p[205]/*父路径*/, c[205]/*残留路径*/;
int maxflow;
int M;
void BFS()
{
    queue<int>q;
    maxflow=0;
    bool there=1;//初始化这里有增广路径
    memset( flow, 0, sizeof( flow ) );
    while(there)//找增广路径的循环,没有增广路径则跳出
    {
        memset( p, 0, sizeof( p ) );
        memset( c, 0, sizeof( c ) );
        c[1]= INF, p[1]=-1;
        q.push( 1 );
        while( !q.empty() )//广搜的循环
        {
            int pos= q.front();
            q.pop();
            for( int i=1; i<= M; ++i )
            {
                if( !c[i]&& flow[pos][i]< cap[pos][i] )  // 残留流量为0并且流入这点的路径中流量比容量小
                {
                    c[i]= min( c[pos], cap[pos][i]- flow[pos][i] );  // 选取当前管道残留容量和截止到上一次的路径残留容量之间的较小者,可以看作是一种更新
                    //即该增广路径的残留容量是有路径中残留容量最小的管道决定的
                    //每一次广搜都要把能使残留流量最小的流储存,在这里更新流会造成破坏,存入不是最优解
                    p[i]= pos;  // 记录父亲路径
                    q.push( i );
                }
            }
        }
        if( c[M]==0 )//没有残留路径到达N点,则跳出循环结束
            there=0;
        maxflow+= c[M];
        int pos= M;
        while(there&& pos!=1 )//从终点倒序更新路径流量,每次只更新
        {
            flow[ p[pos] ][ pos ]+= c[M];
            flow[ pos ][ p[pos] ]-= c[M];
            pos= p[ pos ];
        }
    }
}


int main()
{
    int N,maxflow, ca=0, T;
    scanf( "%d", &T );
    while( T-- )
    {
        scanf( "%d %d", &M, &N );
        memset( cap, 0, sizeof( cap ) );
        for( int i=1; i<= N; ++i )
        {
            int x, y, z;
            scanf( "%d %d %d", &x, &y, &z );
            cap[x][y]+= z;
        }
        BFS();
        printf( "Case %d: %d\n", ++ca, maxflow );
    }
    return 0;
}

/**
6 8
1 2 4
1 3 5
2 4 2
2 5 4
3 4 1
3 5 4
4 6 3
5 6 6
*/


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

最小费用最大流,模板

原文地址:最小费用最大流,模板作者:依然一、最小费用最大流的模型 在保证流量最大的前提下,所需的费用最小,这就是最小费用最大流问题.   带有费用的网络流图: G=(V,E,C,W) V:顶点; E...

UVa11613 Acme Corporation 最小费用最大流模板

  //题目给出T,表示测试组数。M和I表示要考虑的月数和单位的X每月要花费I元。 //再有M行的整数m,n,p,s,e。m表示第i月X的成产成本,n表示最大产量,p表示 //销售单价,s表示当月最大的销售量,e表示可以存储的月数,求最大利润。 //分析: // 每月建立两...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

最大流模板【EdmondsKarp算法,简称EK算法,O(m^2n)】

因为是初学教程,所以我会尽量避免繁杂的数学公式和证明。也尽量给出了较为完整的代码。 本文的目标群体是网络流的初学者,尤其是看了各种NB的教程也没看懂怎么求最大流的小盆友们。本文的目的是,解释基本的网...

【最大流+模板题】杭电 hdu 3549 Flow Problem

    /* THE PROGRAM IS MADE BY PYY */ /*----------------------------------------------------------------------------// Copyright (c) 201...

UVA11248 最大流ISAP模板

  //题意:给定一个有向网络,每条边均有一个容量。问是否存在一个从点1到点N,流量为C的流。 //如果不存在,是否可以恰好修改一条弧的容量,使得存在这样的流? // //分析:先求一次最大流,如果流量至少为C,则直接输出possible,否则需要修改的弧一定是最小割里的弧。 /...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)