网络最大流

#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
#define min( x, y )  (x) < (y) ? (x) : (y)
const int maxn = 100;
const int INF = 0x3f3f3f3f;

struct Edge
{
    int from , to , cap , flow ;
    Edge(int u, int v , int c , int f ): from( u ) , to( v ) , cap( c ) , flow( f ) {}
};

struct EdmondsKarp
{
    int n,m;
    vector<Edge> edges;
    vector<int>  G[maxn];
    int a[maxn];
    int p[maxn];
    void init( int n ){
        for( int i = 0 ; i < n ; i++ ) G[i].clear();
        edges.clear();
    }
    void AddEdge( int from , int to , int cap ){
        edges.push_back( Edge( from , to , cap , 0 ) );
        edges.push_back( Edge( to ,from , 0 , 0 ) );
        m = edges.size() ;
        G[from].push_back( m-2 );
        G[to].push_back( m-1 );
    }
    int Maxflow( int s , int t ){
        int flow = 0;
        for( ; ; )
        {
            memset( a , 0 ,sizeof( a ) );
            queue<int> Q;
            Q.push( s );
            a[s] = INF;
            while( !Q.empty() )
            {
                int x = Q.front() ; Q.pop();
                for( int i = 0 ; i < G[x].size() ; i++ )
                {
                    Edge& e = edges[ G[x][i] ] ;
                    if( !a[e.to] && (e.cap > e.flow) )
                    {
                        p[ e.to ] = G[x][i];
                        a[ e.to ] = min( a[x] , e.cap - e.flow );
                        Q.push( e.to );
                    }
                }
                if( a[t] )  break;
            }
            if( !a[t] ) break;
            for(int u = t ; u != s ; u = edges[ p[u] ].from )  {
                edges[p[u]].flow += a[t];
                edges[p[u]^1].flow -= a[t];
            }
            flow += a[t];
        }
        return flow;
    }
};

int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    EdmondsKarp graph;
    int m, n;
    int from , to , cap ;
    while( ~scanf("%d%d",&m , &n) )
    {
        graph.init( graph.n );
        for( int i = 0 ; i < n ; i++ )
        {
            scanf("%d%d%d",&from , &to , &cap );
            graph.AddEdge( from , to , cap );
        }
        cout << "Max flow : " << graph.Maxflow( 0 , m-1 ) << endl;
    }
    return 0;
}
时间: 2024-10-10 10:09:57

网络最大流的相关文章

算法模板——Dinic网络最大流 2

实现功能:同Dinic网络最大流 1 这个新的想法源于Dinic费用流算法... 在费用流算法里面,每次处理一条最短路,是通过spfa的过程中就记录下来,然后顺藤摸瓜处理一路 于是在这个里面我的最大流也采用这种模式,这样子有效避免的递归,防止了爆栈么么哒 1 type 2 point=^node; 3 node=record 4 g,w:longint; 5 next,anti:point; 6 end; 7 var 8 i,j,k,l,m,n,s,t,flow:longint; 9 a,e:a

POJ--3308--Paratroopers【Dinic】二分图顶点覆盖+网络最大流

链接:http://poj.org/problem?id=3308 题意:未来世界火星人要入侵地球,他们要派一些伞兵来摧毁地球的兵工厂,兵工厂可以视为一个m*n的矩阵,现在知道了他们每个伞兵的降落位置.为了粉碎火星人的阴谋,我们需要在某行或某列来架一个机关枪来消灭一整行或一整列的火星人,但是在这需要一定的花费,告诉每行及每列架机关枪的花费,总花费是每行及每列的花费相乘.求使得火星人全部被消灭的最小花费. 思路:需要消灭所有敌人,是二分图最小点权覆盖问题,要覆盖所有的边并使花费最小,即求最小割,根

POJ--1087--A Plug for UNIX【Dinic】网络最大流

链接:http://poj.org/problem?id=1087 题意:提供n种插座,每种插座只有一个,有m个设备需要使用插座,告诉你设备名称以及使用的插座类型,有k种转换器,可以把某种插座类型转为另一种,可以嵌套使用,比如有设备需使用第4种插座,现在只有第一种插座,但是有两个转换器,1→3和3→4,则通过这两个转换器设备可以充电.每种转换器有无数个.现告诉你相应信息,求至少有多少个设备无法使用插座. 网络最大流单源点单汇点,是一道基础题,图建好就能套模板了.关键是图怎么建. 还是自己设一个源

POJ 3281 Dining(网络最大流)

http://poj.org/problem?id=3281 Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9121   Accepted: 4199 Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others.

POJ 3436 ACM Computer Factory(网络最大流)

http://poj.org/problem?id=3436 ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5286   Accepted: 1813   Special Judge Description As you know, all the computers used for ACM contests must be identical, so the particip

windows使用libvlc进行网络串流遇到的一些问题及解决方法

先贴代码, #define WIFI_W 640#define WIFI_H 480 struct ctx { uchar* frame; }; class CConnectWIFI { public: CConnectWIFI(void); void Init(HWND hWnd); libvlc_instance_t* m_vlcInst; libvlc_media_player_t* m_vlcMplay; libvlc_media_t* m_vlcMedia; struct ctx co

P3376 【模板】网络最大流(70)

题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含三个正整数ui.vi.wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi) 输出格式: 一行,包含一个正整数,即为该网络的最大流. 输入输出样例 输入样例#1: 4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40 输出样例#1: 50

HDU 3549 网络最大流再试

http://acm.hdu.edu.cn/showproblem.php?pid=3549 同样的网络最大流 T了好几次原因是用了cout,改成printf就A了 还有HDU oj的编译器也不支持以下的写法 G[from].push_back((edge){to,cap,G[to].size()}); G[to].push_back((edge){from,0,G[from].size() - 1}); #include<iostream> #include<cstdio> #i

网络最大流算法

网络最大流是指在一个网络流图中可以从源点流到汇点的最大的流量.求解网络最大流的常用算法可以分为增广路径算法和预推进算法.其中,预推进算法的理论复杂度优于增广路径算法,但是编码复杂度过高,且效率优势在很多时候并不是很明显,因此,经常使用的算法为增广路径算法.     增广路径算法主要有Fold-Fulkerson算法,Edmonds-Karp算法,Dinic算法,ISAP算法.其中,Fold-Fulkerson 是最基本的增广路径思想,不能算作严格的算法实现. 增广路径     增广路径算法的思想

POJ--1149--PIGS【网络最大流】

链接:http://poj.org/problem?id=1149 题意:迈克有一个养猪场,有m个猪圈,每个猪圈都上了锁,但是迈克没有钥匙他不能打开猪圈,要买猪的顾客一个接一个来养猪场,每个人有一些猪圈的钥匙,他们要买一定数目的猪,如果顾客要来买猪,他们会提前告诉迈克:他们所拥有的钥匙数量及对应哪些猪圈.要购买的数量,这样迈克就能安排销售计划使卖出的猪最多. 当每个顾客来的时候,将那些他拥有钥匙的猪圈门全部打开,迈克从猪圈中卖出一些猪给他们,如果迈克愿意,他可以重新分配这些被打开的猪圈中的猪,当