网络流模板题

来源:互联网 发布:c语言初学者看什么书 编辑:程序博客网 时间:2024/05/16 12:16

网络流

  • 网络流
      • HihoCoder1369
        • 题意
      • 代码

HihoCoder【1369】

题意:

就是很模板的模板题,让你求一下最大流。

代码:

#include<bits/stdc++.h> using namespace std;const int maxn = 505;const int INF = 0x7fffffff;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];//G[i][j]表示节点i的第j条边在edges中的编号     int a[maxn];//当起点到i的可改进量     int p[maxn];//最短路上p的入弧编号     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(){    int N, M, u, v, c;    cin >> N >> M;    EdmondsKarp ek;    ek.init(N);    for (int i = 0; i < M; ++i) {        cin >> u >> v >> c;        ek.AddEdge(u, v, c);    }    cout << ek.Maxflow(1, N) << endl;    return 0;}
原创粉丝点击