• 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
    ", di.max_flow(1, M));
        return 0;
    }
  • 相关阅读:
    144. Binary Tree Preorder Traversal
    excel 文本拼接
    excel中文转拼音(方便复制版本)
    odoo 日志文件太大处理,logfile自动轮替
    编码对象或者字串中包含Unicode字符怎样转换为中文
    odoo 返回成功提示信息
    odoo 对res_partner,res_users添加字段重启服务失败处理
    odoo 根据当前记录的值动态筛选many2many,many2one,one2many数据
    odoo 中%()d的使用
    nginx 监听非标准端口80,重定向端口丢失问题解决
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5172889.html
Copyright © 2020-2023  润新知