最大流模板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
*/


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

zoj2676 Network Wars(0-1分数规划,最大流模板)

Network Wars 07年胡伯涛的论文上的题:http://wenku.baidu.com/view/87ecda38376baf1ffc4fad25.html 代码: #include ...

isap最大流模板

  • 2014年03月30日 22:43
  • 2KB
  • 下载

nefu473最大流模板简单应用

#include #include using namespace std; const int oo=1e9; const int mm=111111; const int mn=999; in...

p1273最大流(模板)

未完待续 // //  main.cpp //  p1273 // //  Created by Mr.Xue on 17/4/12. //  Copyright © 2017年 M...

最小费用最大流(讲解+模板)

         问题引入:最小费用最大流问题是经济学和管理学中的一类典型问题。在一个网络中每段路径都有“容量”和“费用”两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择路径、...

网络最大流-ISAP算法详解与模板

ISAP算法 ISAP(Improved Shortest Augumenting Path)算法是改进版的SAP算法,如果对效率要求很高的时候,可以用该算法。 (1)概述:算法基于这样的一个...

网络最大流-ISAP算法详解与模板

ISAP算法 ISAP(Improved Shortest Augumenting Path)算法是改进版的SAP算法,如果对效率要求很高的时候,可以用该算法。 (1)概述:算法基于这样的一个事实...

网络最大流:模板(优化后)

一时兴起在LibreOJ上交了下模板然后被卡常……于是努力克服STL依赖症,改过自新……#include #include #include using namespace std; struct I...
  • Mollnn
  • Mollnn
  • 2017年12月10日 22:28
  • 14

hdu4862(14多校第一场B题)及最小费用最大流模板

解题思路: 建立一个流量网络,一个二部图。X部分向Y部分链接的情况表示可以从一个点跳到另一个点,超级源点和超级汇点分别同X部分的点和Y部分的点链接。在X部分中多加一个点它与源点的流量是K费用是0,与...

最大流的理解以及dinic模板 poj1273

增广路以及残留网络的定义不再赘述了。算导上说的很清楚,证明也有,看懂了就知道怎么求最大流了。 而算导上提到的FF方法以及ek算法的伪代码中都是将流与残留容量分开储存,其实代码实现的时候我们只需存正反...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最大流模板1
举报原因:
原因补充:

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