最大流 Ford-Fulkerson算法

最大流问题:

  管道网络中每条边的最大通过能力(容量)是有限的,实际流量不超过容量。

  最大流问题(maximum flow problem),一种组合最优化问题,就是要讨论如何充分利用装置的能力,使得运输的流量最大,以取得最好的效果。

Ford-Fulkerson算法:

(1)只利用满足f(e) < c(e)的e或者满足f(e) > 0的e对应的反向边rev(e),寻找一条s到t的路径。

(2)如果不存在满足条件的路径,则结束。否则,沿着该路径尽可能地增加流,放回第(1)步。

f为边的流量,c为边的容量,s为源点,t为汇点。

Ford-Fulkerson算法主要是利用的反向点来算的。假设从A—>B可以流的流量是W,那么从B—>A就可以压回去W流量。

HDU3549为例,这个就是标准的最大流问题。

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <vector>
 5 #define INF 0x3f3f3f3f
 6 using namespace std;
 7 const int MAX = 1010;
 8 struct Nod {
 9     int to, cap, rev;
10 };
11 vector<Nod> G[MAX];
12 bool vis[MAX];
13 void add_edge(int from, int to, int cap) {
14     G[from].push_back((Nod){to,cap,(int)G[to].size()});
15     G[to].push_back((Nod){from,0,(int)G[from].size()-1});
16 }
17 int dfs(int v, int t, int f) {
18     if(v == t) return f;
19     vis[v] = true;
20     for(int i = 0; i < G[v].size(); i ++) {
21         Nod &e = G[v][i];
22         if(!vis[e.to] && e.cap > 0) {
23             int d = dfs(e.to, t, min(f,e.cap));
24             if(d > 0) {
25                 e.cap -= d;
26                 G[e.to][e.rev].cap += d;
27                 return d;
28             }
29         }
30     }
31     return 0;
32 }
33 int max_flow(int s, int t){
34     int flow = 0;
35     while(1) {
36         memset(vis,0,sizeof(vis));
37         int f = dfs(s, t, INF);
38         if(f == 0) return flow;
39         flow += f;
40     }
41 }
42 int main() {
43     int t, n, m;
44     scanf("%d",&t);
45     for(int k = 1; k <= t; k ++) {
46         scanf("%d %d",&n, &m);
47         while(m--) {
48             int u, v, w;
49             scanf("%d %d %d",&u, &v, &w);
50             add_edge(u,v,w);
51         }
52         printf("Case %d: %d\n",k,max_flow(1,n));
53         for(int i = 1; i <= n; i ++) G[i].clear();
54     }
55     return 0;
56 }
时间: 2024-12-20 23:38:15

最大流 Ford-Fulkerson算法的相关文章

ACM/ICPC 之 网络流入门-Ford Fulkerson(POJ1149)

按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点 //第一道网络流 //Ford-Fulkerson //Time:47Ms Memory:276K #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> using namespace std; #def

最大流之sap算法

若有向图G = (V , E)满足下列条件: 1.有且仅有一个顶点S,它的入度为 0 ,这个顶点称为源点. 2.有且仅有一个顶点T,它的出度为 0 ,这个顶点称为汇点. 3.每一条弧都有一个非负数,叫做这条边的容量,边(Vi , Vj)的容量用 Cij 来表示. 则此有向图称为网络流图,记为 G = ( V , E , C) ; 对于网络流图G中,每一条弧( i , j )都给定一个非负数Fij,对于一组数据满足下面三个条件时,称为可行流: 1.对于每条弧都有 Fij < Cij ; 2.出了源

关于最大流的EdmondsKarp算法详解

最近大三学生让我去讲课,我就恶补了最大流算法,笔者认为最重要的是让学弟学妹们入门,知道算法怎么来的?为什么是这样?理解的话提出自己的改进,然后再看看Dinic.SAP和ISAP算法….. 一.概念引入 首先要先清楚最大流的含义,就是说从源点到经过的所有路径的最终到达汇点的所有流量和. 流网络G=(V,E)是一个有向图,其中每条边(u,v)∈E均有一个非负容量c(u,v)>=0.如果(u,v)不属于E,则假定c(u,v)=0.流网络中有两个特别的顶点:源点s和汇点t.下图展示了一个流网络的实例(其

POJ 1273 Drainage Ditches (网络流最大流基础 Edmonds_Karp算法)

Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 59219   Accepted: 22740 Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by

UVA 10735 Euler Circuit 混合图的欧拉回路(最大流,fluery算法)

题意:给一个图,图中有部分是向边,部分是无向边,要求判断是否存在欧拉回路,若存在,输出路径. 分析:欧拉回路的定义是,从某个点出发,每条边经过一次之后恰好回到出发点. 无向边同样只能走一次,只是不限制方向而已,那么这个情况下就不能拆边.不妨先按照所给的start和end的顺序,初步定下该无向边的顺序(若不当,一会再改).那么有个问题,我们需要先判断其是否存在欧拉回路先. 混合图不满足欧拉回路因素有:(1)一个点的度(无论有无向)是奇数的,那么其肯定不能满足出边数等于入边数.(2)有向边的出入度过

Codeforces Round #304 (Div. 2) E. Soldier and Traveling 最大流 Dinic EK 算法

E. Soldier and Traveling time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output In the country there are n cities and m bidirectional roads between them. Each city has an army. Army of the i-th ci

HDU 3549 Flow Problem (用一道最裸的最大流开启网络流算法之路)

Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 9423    Accepted Submission(s): 4405 Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, y

POJ 1459 Power Network 经典网络流构图问题 最大流,EK算法

题目链接:POJ 1459 Power Network Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 23347   Accepted: 12231 Description A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport line

最大流的EK算法模板

模板题:洛谷p3376 题目大意: 给出一个网络图,以及其源点和汇点,求出其网络最大流. 基本思路: 套模板 EK的时间复杂度O(V*E^2) EK算法思路: 1.通过BFS拓展合法节点(每个节点在本次BFS中仅遍历一次),找到汇点,并记录每个节点的前面节点(pre)(若找不到增广路,算法结束) 2.通过BFS的记录,从汇点回溯回源点,记录下每条弧流量的**最小值**minn, ans += minn(否则就会超出某条边的限制流量) 3.将所有经过的边的流量减去minn,反向边加上minn 4.

最大流-前置push-relabel算法实现

Front Push-Relabel Algorithm 接口定义 Input:容量数组vector<vector<int>> capacity ,大小为n:源点int source,汇点int sink: Output:最大流int maxflow: 算法描述 数据结构 flow:n*n的二维数组,表示结点间的流量,flow[u][v]非零当且仅当capacity[u][v]非零. excess:n维数组,表示结点的溢出流量. height:n维数组,表示结点的高度. L:除去源