• hiho一下115周 网络流


    小Hi和小Ho住在P市,P市是一个很大很大的城市,所以也面临着一个大城市都会遇到的问题:交通拥挤。

    小Ho:每到周末回家感觉堵车都是一种煎熬啊。

    小Hi:平时交通也还好,只是一到上下班的高峰期就会比较拥挤。

    小Ho:要是能够限制一下车的数量就好了,不知道有没有办法可以知道交通系统的最大承受车流量,这样就可以限制到一个可以一直很顺畅的数量了。

    小Hi:理论上是有算法的啦。早在1955年,T.E.哈里斯就提出在一个给定的网络上寻求两点间最大运输量的问题。并且由此产生了一个新的图论模型:网络流

    小Ho:那具体是啥?

    小Hi:用数学的语言描述就是给定一个有向图G=(V,E),其中每一条边(u,v)均有一个非负数的容量值,记为c(u,v)≥0。同时在图中有两个特殊的顶点,源点S和汇点T。

    举个例子:

    其中节点1为源点S,节点6为汇点T。

    我们要求从源点S到汇点T的最大可行流量,这个问题也被称为最大流问题

    在这个例子中最大流量为5,分别为:1→2→4→6,流量为1;1→3→4→6,流量为2;1→3→5→6,流量为2。

    小Ho:看上去好像挺有意思的,你让我先想想。

    提示:Ford-Fulkerson算法

    输入

    第1行:2个正整数N,M。2≤N≤500,1≤M≤20,000。

    第2..M+1行:每行3个整数u,v,c(u,v),表示一条边(u,v)及其容量c(u,v)。1≤u,v≤N,0≤c(u,v)≤100。

    给定的图中默认源点为1,汇点为N。可能有重复的边。

    输出

    第1行:1个整数,表示给定图G的最大流。

    样例输入
    6 7
    1 2 3
    1 3 5
    2 4 1
    3 4 2
    3 5 3
    4 6 4
    5 6 2
    样例输出
    5
    【分析】就是个Dinic模板题
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <time.h>
    #include <string>
    #include <map>
    #include <stack>
    #include <vector>
    #include <set>
    #include <queue>
    #define inf 0x3f3f3f3f
    #define mod 10000
    typedef long long ll;
    using namespace std;
    const int N=505;
    const int M=100005;
    int n,m,k,ans,t;
    int pre[N];
    struct man
    {
        int c,f;
    }w[N][N];
    bool bfs()
    {
        queue<int>q;
        q.push(1);
        memset(pre,0,sizeof(pre));
        pre[1]=1;
        while(!q.empty()){
            int u=q.front();q.pop();
            for(int i=1;i<=t;i++){
                if( !pre[i] && w[u][i].c>w[u][i].f){
                    pre[i]=pre[u]+1;
                    q.push(i);
                }
            }
        }
        return pre[t]!=0;
    }
    int dfs(int u,int sum)
    {
        if(u==t||sum==0)return sum;
        int tmp=sum,minn;
        for(int i=1;i<=t;i++){
            if(pre[i]==pre[u]+1&&w[u][i].c>w[u][i].f){
                minn=dfs(i,min(tmp,w[u][i].c-w[u][i].f));
                w[u][i].f+=minn;
                w[i][u].f -=minn;
                tmp-=minn;
            }
        }
        return sum-tmp;
    }
    void Dinic()
    {
        ans=0;
        while(bfs())ans+=dfs(1,inf);
        cout<<ans<<endl;
    }
    int main() {
        scanf("%d%d",&n,&m);
        memset(w,0,sizeof(w));
        int a,b,v;
        t=n;
        while(m--)scanf("%d%d%d",&a,&b,&v),w[a][b].c+=v;
        Dinic();
        return 0;
    }
    View Code
  • 相关阅读:
    程序笔记
    2011年11月28日学习重构
    经典到发狂的语录(某男日记摘录)
    每天养成好习惯
    jquery用法
    [读书笔记]软件架构师应该知道的97件事
    Entity Framework 4.2发布,部分更新等待.NET Framework 4.5
    我的阅书记录及相关专业书籍推荐(更新于2017.12)
    [2011 年终项目总结] 第四章、架构设计
    [2011 年终项目总结] 第五章、迭代开发
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/5861344.html
Copyright © 2020-2023  润新知