HDU3549 ISAP板子题

来源:互联网 发布:mac如何设置用户头像 编辑:程序博客网 时间:2024/05/18 01:01
#include <bits/stdc++.h>using namespace std;const int inf = 0x3fffffff;template <int N, int M>struct Isap{    int top;    int d[N], pre[N], cur[N], gap[N];    struct Vertex {        int head;    } V[N];    struct Edge {        int v, next;        int c, f;    } E[M];    void init() {        memset(V, -1, sizeof(V));        top = 0;    }    void add_edge(int u, int v, int c) {        E[top].v = v;        E[top].c = c;        E[top].f = 0;        E[top].next = V[u].head;        V[u].head = top++;    }    void add(int u, int v, int c) {        add_edge(u, v, c);        add_edge(v, u, 0);    }    void set_d(int t) {        queue<int> Q;        memset(d, -1, sizeof(d));        memset(gap, 0, sizeof(gap));        d[t] = 0;        Q.push(t);        while (!Q.empty()) {            int v = Q.front(); Q.pop();            ++gap[d[v]];            for (int i = V[v].head; ~i; i = E[i].next) {                int u = E[i].v;                if (d[u] == -1) {                    d[u] = d[v] + 1;                    Q.push(u);                }            }        }    }    int sap(int s, int t, int num) {        set_d(t);        int ans = 0, u = s;        int flow = inf;        memcpy(cur, V, sizeof(V));        while (d[s] < num) {            int &i = cur[u];            for (; ~i; i = E[i].next) {                int v = E[i].v;                if (E[i].c > E[i].f && d[u] == d[v] + 1) {                    u = v;                    pre[v] = i;                    flow = min(flow, E[i].c - E[i].f);                    if (u == t) {                        while (u != s) {                            int j = pre[u];                            E[j].f += flow;                            E[j ^ 1].f -= flow;                            u = E[j ^ 1].v;                        }                        ans += flow;                        flow = inf;                    }                    break;                }            }            if (i == -1) {                if (--gap[d[u]] == 0)                    break;                int dmin = num - 1;                cur[u] = V[u].head;                for (int j = V[u].head; ~j; j = E[j].next)                    if (E[j].c > E[j].f)                        dmin = min(dmin, d[E[j].v]);                d[u] = dmin + 1;                ++gap[d[u]];                if (u != s)                    u = E[pre[u] ^ 1].v;            }        }        return ans;    }};Isap<100005, 200005> Sap;int T, n, m, s, t, x, y, z, xx, yy, a[100005], b[100005];int main(int argc, char const *argv[]){    //ios::sync_with_stdio(false);    int u=0;        cin >> n >> m;        Sap.init();        xx=1,yy=n;        while (m--) cin >> x >> y >> z, Sap.add(x, y, z);//Sap.add(y, x, z);        printf("Case %d: %d\n",++u,Sap.sap(xx, yy, n)) ;}
0 0
原创粉丝点击