zoukankan      html  css  js  c++  java
  • POJ 1273 Drainage Ditches(最大流Dinic 模板)

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n, m, S, T;
    const int MAXN = 2010;//点数的最大值
    const int MAXM = 1200010;//边数的最大值
    const int INF = 0x3f3f3f3f;
    struct Edge
    {
        int to,next,cap,flow;
    
    } edge[MAXM]; //注意是MAXM
    int tol;
    int head[MAXN];
    void init()
    {
        tol = 2;
        memset(head,-1,sizeof(head));
    }
    void addedge(int u,int v,int w,int rw = 0)
    {
        edge[tol].to = v;
        edge[tol].cap = w;
        edge[tol].flow = 0;
        edge[tol].next = head[u];
        head[u] = tol++;
        edge[tol].to = u;
        edge[tol].cap = rw;
        edge[tol].flow = 0;
        edge[tol].next = head[v];
        head[v] = tol++;
    }
    int Q[MAXN];
    int dep[MAXN],cur[MAXN],sta[MAXN];
    bool bfs(int s,int t,int n)
    {
        int front = 0,tail = 0;
        memset(dep,-1,sizeof(dep[0])*(n+1));
        dep[s] = 0;
        Q[tail++] = s;
        while(front < tail)
        {
            int u = Q[front++];
            for(int i = head[u]; i != -1; i = edge[i].next)
            {
                int v = edge[i].to;
                if(edge[i].cap > edge[i].flow && dep[v] == -1)
                {
                    dep[v] = dep[u] + 1;
                    if(v == t)
                        return true;
                    Q[tail++] = v;
                }
            }
        }
        return false;
    }
    int dinic(int s,int t,int n)
    {
        int maxflow = 0;
        while(bfs(s,t,n))
        {
            for(int i = 0; i < n; i++)
                cur[i] = head[i];
            int u = s, tail = 0;
            while(cur[s] != -1)
            {
                if(u == t)
                {
                    int tp = INF;
                    for(int i = tail-1; i >= 0; i--)
                        tp = min(tp,edge[sta[i]].cap-edge[sta[i]].flow);
                    maxflow += tp;
                    for(int i = tail-1; i >= 0; i--)
                    {
                        edge[sta[i]].flow += tp;
                        edge[sta[i]^1].flow -= tp;
                        if(edge[sta[i]].cap-edge[sta[i]].flow == 0)
                            tail = i;
                    }
    
                    u = edge[sta[tail]^1].to;
                }
                else if(cur[u] != -1 && edge[cur[u]].cap > edge[cur[u]].flow && dep[u] + 1 == dep[edge[cur[u]].to])
                {
                    sta[tail++] = cur[u];
                    u = edge[cur[u]].to;
                }
                else
                {
                    while(u != s && cur[u] == -1)
                        u = edge[sta[--tail]^1].to;
                    cur[u] = edge[cur[u]].next;
                }
            }
        }
        return maxflow;
    }
    int main()
    {
        while(~scanf("%d %d", &m, &n))
        {
            init();
            for(int i = 0; i < m; i++)
            {
                int u, v, w;
                scanf("%d %d %d", &u, &v, &w);
                addedge(u,v, w);
            }
            printf("%d
    ", dinic(1, n, n));
        }
        return 0;
    }
  • 相关阅读:
    ACM实用C语言函数
    Java中的数组和方法
    eclipse常用快捷键
    【转载】第十章 五种对称加密算法总结
    【转载】ZooKeeper学习第二期--ZooKeeper安装配置
    【转载】Java垃圾回收机制
    【转载】JVM系列三:JVM参数设置、分析
    【转载】JVM系列二:GC策略&内存申请、对象衰老
    【转载】JVM系列一:JVM内存组成及分配
    java项目性能测试过程记录
  • 原文地址:https://www.cnblogs.com/Jadon97/p/9414849.html
Copyright © 2011-2022 走看看