最大网络流

来源:互联网 发布:数据库软件工程师考试 编辑:程序博客网 时间:2024/05/22 15:13

首先是FF算法:

#include <iostream>#include <vector>#include <climits>#include <cstring>using namespace std;const int MAX_V = 1100;struct edge{int to, cap, rev;};   ///邻接表表示,点,容量,反向边vector<edge> G[MAX_V];bool used[MAX_V];/// 贪心策略: 1.找到f < c 或者 f > 0 的边,寻找路径 2.不存在路径则结束,若存在路径则返回1继续寻找void add_edge(int from, int to, int cap) {    ///添加边    G[from].push_back((edge){to, cap, G[to].size()});    G[to].push_back((edge){from, 0, G[from].size() - 1});}int dfs(int v, int t, int f) {    if(v == t) return f;    used[v] = true;    for(int i = 0; i < G[v].size(); ++i) {        edge &e = G[v][i];        if(!used[e.to] && e.cap > 0) {            int d = dfs(e.to, t, min(f, e.cap));            if(d > 0) {                e.cap -= d;    ///该边减小容量                G[e.to][e.rev].cap += d;   ///反向边增加容量                return d;            }        }    }}int max_flow(int s, int t) {    int flow = 0;    for(;;) {        memset(used, 0, sizeof(used));        int f = dfs(s, t, INT_MAX);        if(f == 0) return flow;        flow += f;    }}int main(){    int n;    cin >> n;    for(int i = 0; i < n; ++i) {        int from, to, cap;        cin >> from >> to >> cap;        add_edge(from, to, cap);    }    cout << max_flow(0, 4) << endl;    return 0;}/*70 1 101 2 60 2 21 3 63 2 33 4 82 4 5*/



然后是Dinic算法:

#include <iostream>#include <vector>#include <cstring>#include <queue>using namespace std;const int INF = INT_MAX;const int MAX_V = 1000;struct edge {    int to, cap, rev;};vector<edge> G[MAX_V];int level[MAX_V];int iter[MAX_V];void add_edge(int from, int to, int cap) ///添加边{    G[from].push_back((edge) {to, cap, G[to].size()});    G[to].push_back((edge) {from, 0, G[from].size() - 1});}void bfs(int s)  ///构造最短路径的分层图{    memset(level, -1, sizeof(level));    queue<int> que;    level[s] = 0;    que.push(s);    while(!que.empty()) {        int v = que.front();        que.pop();        for(int i = 0; i < G[v].size(); ++i) {            edge &e = G[v][i];            if(e.cap > 0 && level[e.to] < 0) {                level[e.to] = level[v] + 1;                que.push(e.to);            }        }    }}int dfs(int v, int t, int f) {  ///深搜路径    if(v == t) return f;    for(int &i = iter[v]; i < G[v].size(); ++i) {        edge &e = G[v][i];        if(e.cap > 0 && level[v] < level[e.to]) {            int d = dfs(e.to, t, min(f, e.cap));            if(d > 0) {                e.cap -= d;                G[e.to][e.rev].cap += d;                return d;            }        }    }    return 0;}int max_flow(int s, int t){    int flow = 0;    for(;;) {        bfs(s);        if(level[t] < 0) {            return flow;        }        memset(iter, 0, sizeof(iter));       ///iter之前的边都没有用了        int f;        while((f = dfs(s, t, INF)) > 0) {            flow += f;        }    }}int main(){    int n;    cin >> n;    for(int i = 0; i < n; ++i) {        int from, to, cap;        cin >> from >> to >> cap;        add_edge(from, to, cap);    }    int s, t;    cout << max_flow(0, 4) << endl;    return 0;}



0 0