dinic算法模板

/*
    ID: m1500293
    LANG: C++
    PROG: ditch
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;
const int maxn = 10000;

struct Dinic
{
    int n;       //n个顶点
    struct edge
    {
        int from, to, cap;
    };
    vector<int> G[maxn];
    vector<edge> e;
    int level[maxn], iter[maxn];

    void init()
    {
        for(int i=0; i<=n; i++) G[i].clear();
        e.clear();
    }

    void add_edge(int u, int v, int cap)
    {
        e.push_back((edge)
        {
            u, v, cap
        });
        e.push_back((edge)
        {
            v, u, 0
        });
        int m = e.size();
        G[u].push_back(m-2);
        G[v].push_back(m-1);
    }

    void bfs(int s)
    {
        memset(level, -1, sizeof(level));
        queue<int> que;
        level[s] = 0;
        que.push(s);
        while(!que.empty())
        {
            int u = que.front();
            que.pop();
            for(int i=0; i<G[u].size(); i++)
            {
                edge &te = e[G[u][i]];
                if(te.cap>0 && level[te.to]<0)
                {
                    level[te.to] = level[u] + 1;
                    que.push(te.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 &tpe = e[G[v][i]];
            if(tpe.cap>0 && level[v]<level[tpe.to])
            {
                int d = dfs(tpe.to, t, min(f, tpe.cap));
                if(d > 0)
                {
                    tpe.cap -= d;
                    e[G[v][i]^1].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));
            int f;
            while((f=dfs(s, t, 0x3fffffff)) > 0)
                flow += f;
        }
    }
} di;
int main()
{
//    n = 2;
//    init();
//    add_edge(1, 2, 1);
//    add_edge(1, 3, 1);
//    add_edge(2, 3, 1);
//    add_edge(2, 4, 1);
//    add_edge(3, 4, 1);
//    printf("%d", max_flow(1, 4));
    //freopen("ditch.in", "r", stdin);
    //freopen("ditch.out", "w", stdout);
    int N, M;
    scanf("%d%d", &N, &M);
    di.n = M;
    di.init();
    for(int i=1; i<=N; i++)
    {
        int u, v, c;
        scanf("%d%d%d", &u, &v, &c);
        di.add_edge(u, v, c);
    }
    printf("%d\n", di.max_flow(1, M));
    return 0;
}

 

posted @ 2016-01-31 10:10  xing-xing  阅读(171)  评论(0编辑  收藏  举报