模板_Dinic算法

来源:互联网 发布:网易域名邮箱注册 编辑:程序博客网 时间:2024/06/05 20:36
const int inf = 0x3f3f3f3f;const int MX = 105;const int MXE = 4 * MX * MX;struct MaxFlow {    struct Edge {        int v, w, nxt;    } edge[MXE];    int tot, num, s, t;    int head[MX];    void init() {        memset(head, -1, sizeof(head));        tot = 0;    }    void add(int u, int v, int w) {        edge[tot].v = v;        edge[tot].w = w;        edge[tot].nxt = head[u];        head[u] = tot++;        edge[tot].v = u;        edge[tot].w = 0;        edge[tot].nxt = head[v];        head[v] = tot++;    }    int  d[MX], vis[MX], gap[MX];    void bfs() {        memset(d, 0, sizeof(d));        memset(gap, 0, sizeof(gap));        memset(vis, 0, sizeof(vis));        queue<int>q;        q.push(t);        vis[t] = 1;        while (!q.empty()) {            int u = q.front();            q.pop();            for (int i = head[u]; ~i; i = edge[i].nxt) {                int v = edge[i].v;                if (!vis[v]) {                    d[v] = d[u] + 1;                    gap[d[v]]++;                    q.push(v);                    vis[v] = 1;                }            }        }    }    int last[MX];    int dfs(int u, int f) {        if (u == t) return f;        int sap = 0;        for (int i = last[u]; ~i; i = edge[i].nxt) {            int v = edge[i].v;            if (edge[i].w > 0 && d[u] == d[v] + 1) {                last[u] = i;                int tmp = dfs(v, min(f - sap, edge[i].w));                edge[i].w -= tmp;                edge[i ^ 1].w += tmp;                sap += tmp;                if (sap == f) return sap;            }        }        if (d[s] >= num) return sap;        if (!(--gap[d[u]])) d[s] = num;        ++gap[++d[u]];        last[u] = head[u];        return sap;    }    int solve(int st, int ed, int n) {        int flow = 0;        num = n;        s = st;        t = ed;        bfs();        memcpy(last, head, sizeof(head));        while (d[s] < num) flow += dfs(s, inf);        return flow;    }} F;

原创粉丝点击