【网络流】最大流最简单的Ford-Fulkerson算法

来源:互联网 发布:创维网络电视怎么放dvd 编辑:程序博客网 时间:2024/06/05 08:47

Ford-Fulkerson算法是一个非常好理解的算法。大概是这样子的:
①不断从起点开始dfs 找一个通向终点的路。如果一条都找不到了,那么当前的值就是最大流
②如果还存在着通向终点的路,那么加上它的最短的一截,然后做出图的残余图。继续。

下面是基于邻接矩阵的Ford-Fulkerson最大流算法。简单易懂,老少皆宜。

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;int map[300][300];int used[300];int n,m;const int INF = 1000000000;int dfs(int s,int t,int f){    if(s == t) return f;    for(int i = 1 ; i <= n ; i ++) {        if(map[s][i] > 0 && !used[i]) {            used[i] = true;            int d = dfs(i,t,min(f,map[s][i]));            if(d > 0) {                map[s][i] -= d;                map[i][s] += d;                return d;            }        }    }}int maxflow(int s,int t){    int flow = 0;    while(true) {        memset(used,0,sizeof(used));        int f = dfs(s,t,INF);//不断找从s到t的增广路        if(f == 0) return flow;//找不到了就回去        flow += f;//找到一个流量f的路    }}int main(){    while(scanf("%d%d",&m,&n) != EOF) {        memset(map,0,sizeof(map));        for(int i = 0 ; i < m ; i ++) {            int from,to,cap;            scanf("%d%d%d",&from,&to,&cap);            map[from][to] += cap;        }        cout << maxflow(1,n) << endl;    }    return 0;}
1 0
原创粉丝点击