增广路算法

#include<queue>
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

const int maxn = 20;
const int INF = (1<<30);

int cap[maxn][maxn],flow[maxn][maxn];//cap记录容量,flow记录流量
int m;  //弧的数量

int EdmondsKarp(int s,int t)
{
    int p[maxn],a[maxn];
    queue<int>q;

    memset(flow,0,sizeof(flow)); //初始化流量数组
    int f=0;

    while(true)
    {
        memset(a,0,sizeof(a));

        a[s]=INF;

        q.push(s);

        while(!q.empty())//BFS找增广路
        {
            int u=q.front(); q.pop();

            for(int v=1;v<=n;v++)
            if(!a[v] && cap[u][v]>flow[u][v]) //由于a[i]总是正数,所以使用a[i]代替vis数组。
            {
                //找新的节点v
                p[v]=u; q.push(v);
                a[v]=min(a[u],cap[u][v]-flow[u][v]);
            }
        }

        if(a[t] == 0) break; //找不到,说明当前流已经是最大流

        for(int u=t;u!=s;u=p[u])
        {
            flow[p[u]][u] += a[t];//更新正向流量
            flow[u][p[u]] -= a[t];//更新反向流量
        }

        f += a[t]; //更新从s流出的流量
    }

    return f;

}

int main(void)
{
    cin >> m;
    int u,v;
    for(int i=1;i<=m;i++)
    {
        cin >> u >> v;
        cin >> cap[u+1][v+1];
        cap[v+1][u+1]=0;
    } 

    int f = EdmondsKarp(1,6);

    cout<< f;

    return 0;
}

/*
10
0 1 8
0 2 4
1 3 2
1 4 2
2 1 4
2 3 1
2 4 4
3 4 6
3 5 9
4 5 7
*/

结果为8

原文地址:https://www.cnblogs.com/zuimeiyujianni/p/9016146.html

时间: 2024-08-28 23:56:46

增广路算法的相关文章

最大流——增广路算法

关于网络流的增广路算法,网上有很多详细介绍,这里是摘录的模板.详细请见:http://www.cnblogs.com/kuangbin/archive/2011/07/26/2117636.html 1 #include<iostream> 2 #include<iomanip> 3 #include<ctime> 4 #include<climits> 5 #include<algorithm> 6 #include<queue>

关于最短增广路算法和连续最短增广路算法的操作步骤

最短增广路算法(SAP): 1.初始化容量网络和网络流: 2.构造残留网络和层次网络,如果汇点不在层次网络中,则算法结束: 3.在层次网络中不断用BFS增广,直到层次网络中没有增广路为止:每次增广完毕,在层次网络中要去掉因改进流量而导致饱和的弧: 4.转到步骤(2). 连续最短增广路算法(Dinic): 1.初始化容量网络和网络流: 2.构造残留网络和层次网络,如果汇点不在层次网络中,则算法结束: 3.在层次网络中用一次DFS过程进行增广,DFS执行完毕,该阶段的增广也执行完毕: 4.转到步骤(

Power Network(最大流基础_增广路算法:多源多汇,自建总源点和总汇点)

 Power NetworkCrawling in process... Crawling failed Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description A power network consists of nodes (power stations, consumers and dispatchers) connected by p

Drainage Ditches(最大流基础_增广路算法)

 Drainage DitchesCrawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover p

最大网络流——增广路算法

几句废话:读了刘汝佳的书之后,感觉一切都是那么茫然,于是自己在网上找教程,自己一点点码的,大概用了三天.网络流基础:看来我很有必要说一下网络流的基础网络流问题就是给你一个图,每个图的边权叫做这条边的流量,问你从起始点出发,有多少值能通过这些边流到重点我知道你没看懂,举个例子: 如图: 最大值为 从1到2到4运6个 从1到2到3到4运1个 从1到3到4运3个 一共运10个. 举例说完了,那么我说几个定义: 容量,就只一条边的权值,表示能从这条边运送的最大值 流量,表示一条边实际上流过的最大值 那么

网络流 之 一般增广路算法 标号法实现

数据输入格式:首先输入顶点个数n和弧数m,然后输入每条弧的数据.规定源点为顶点0,汇点为顶点n-1.每条弧的数据格式为:u,v,c,f,分别表示这条弧的起点,终点,容量和流量.顶点序号从0开始. 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <str

网络流之 最短增广路算法模板(SAP)

数据输入格式:首先输入顶点个数n和弧数m,然后输入每条弧的数据.规定源点为顶点0,汇点为顶点n-1.每条弧的数据格式为:u,v,w,分别表示这条弧的起点,终点,容量.顶点序号从0开始. 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <string&g

网络流——增广路算法(dinic)模板

1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstdio> 6 #include<queue> 7 using namespace std; 8 struct data 9 { 10 int from,to,next,cup,flow; 11 data(){from=-1,to=-1,next=-

网络流初步——增广路算法(EK)模板

1 #include <iostream> 2 #include <queue> 3 #include<string.h> 4 using namespace std; 5 #define arraysize 201 6 int maxData = 0x7fffffff; 7 int a[222][222]; 8 int flow[222]; 9 int pre[222]; 10 int n,m; 11 queue<int> q; 12 int BFS(in