网络最大流(dinic)模板

来源:互联网 发布:python 分布式 web 编辑:程序博客网 时间:2024/06/05 17:10
#include <iostream>using namespace std;const int maxn=150000;const int maxm=2000000;const int inf=1<<30;struct edge{int from, to, val, next;}e[maxm];;int v[maxn], que[maxn], dis[maxn],len;void init(){    len=0;    memset(v, -1, sizeof(v)); }void insert(int from, int to, int va){    e[len].from = from, e[len].to = to; e[len].val = va;    e[len].next = v[from];v[from] = len++;    e[len].from = to, e[len].to = from; e[len].val = 0;    e[len].next = v[to];v[to] = len++;}int Dinic(int n, int s, int t){    int ans = 0;    while(true)    {        int head, tail, id,i;        head = tail = 0; que[tail++] = s;        memset(dis, -1, sizeof(dis)); dis[s] = 0;        while(head < tail)        {            id = v[que[head++]];            while(id != -1)            {                if (e[id].val > 0 && dis[e[id].to] == -1)                {                    dis[e[id].to] = dis[e[id].from] + 1;                    que[tail++] = e[id].to;                    if (e[id].to == t)                    {                        head = tail;                        break;                    }                }                id = e[id].next;            }        }        if (dis[t] == -1) break;        id = s, tail = 0;        while(true)        {            if (id == t) // 找到一条增广路            {                int flow =inf,fir;                for(i = 0; i < tail; i++)                    if (e[que[i]].val < flow)                    {                        fir = i;                        flow = e[que[i]].val;                    }                    for(i = 0; i < tail; i++)                        e[que[i]].val -= flow, e[que[i] ^ 1].val += flow;                    ans += flow; tail = fir; id = e[que[fir]].from;            }            id = v[id];            while(id != -1)            {                if (e[id].val > 0 && dis[e[id].from] + 1 == dis[e[id].to])                    break;                id = e[id].next;            }            if (id != -1)            {                que[tail++] = id;                id = e[id].to;            }            else            {                if (tail == 0) break;                dis[e[que[tail - 1]].to] = -1;                id = e[que[--tail]].from;            }        }    }    return ans;}int main(){    int t,n,m,a,b,c,cas;    while (scanf("%d",&t)!=EOF)    {        cas = 0;        while (t--)        {            init();            scanf("%d%d",&n,&m);            while (m--)            {                scanf("%d%d%d",&a,&b,&c);                insert(a-1,b-1,c);            }            printf("Case %d: %d/n",++cas,Dinic(n,0,n-1));        }    }    return 0;}

0 0
原创粉丝点击