• 网络最大流——POJ


    题目链接

    题目含义

    说了一大堆,就是发电站发电,中转站不用电不发电,用户用电,而且每个都有一个电流的限制

    问用户们最多能得到多少电

    题目分析

    用一个超级源头指向所有发电站,最大容量是他们的发电量

    将所有用户指向一个终点,最大容量是他们的用电量

    于是就变成了一个最简单的最大流

    以后遇到类似的题,像这样转化就可以了

    但是输入很烦,要想读括号这几个字符,又会因为读空格导致出错,注意一下就行了

    题目代码

    #include<stdio.h>
    #include<string.h>
    #include<queue>
    using namespace std;
    typedef long long LL;
    const int maxn=1e4+7;
    const int INF=0x3f3f3f3f;
    int head[107],deep[107];
    LL maxflow,z;
    int tot,n,m,np,nc,u,v;
    struct edge{
        int to,next;
        LL dis;
    }e[maxn*2];
    void add(int u,int v,LL w){
        e[tot].to=v;
        e[tot].dis=w;
        e[tot].next=head[u];
        head[u]=tot++;
    }
    bool Bfs(int s,int t){
        memset(deep,0,sizeof(deep));
        queue<int>q;
        deep[s]=1;
        q.push(s);
        while(!q.empty()){
            int u=q.front();q.pop();
            for(int i=head[u];i!=-1;i=e[i].next){
                int v=e[i].to;
                if(!deep[v]&&e[i].dis){
                    deep[v]=deep[u]+1;
                    q.push(v);
                }
            }
        }return deep[t];
    }
    LL Dfs(int u,int t,LL dis){
        if(u==t||!dis)return dis;
        LL sum=0;
        for(int i=head[u];i!=-1;i=e[i].next){
            int v=e[i].to;
            if(deep[v]==deep[u]+1&&e[i].dis){
                LL temp=Dfs(v,t,min(dis,e[i].dis));
                if(temp){
                    sum+=temp;
                    dis-=temp;
                    e[i].dis-=temp;
                    e[i^1].dis+=temp;
                    if(!dis)break;
                }
            }
        }return sum;
    }
    void Dinic(int s,int t){
        while(Bfs(s,t)){
            maxflow+=Dfs(s,t,INF);
        }
    }
    void init(){
        memset(head,-1,sizeof(head));
        tot=maxflow=0;
    }
    int main(){
        while(~scanf("%d%d%d%d",&n,&np,&nc,&m)){
            init();
            for(int i=1;i<=m;i++){
                while(getchar()!='(');
                scanf("%d%*c%d%*c%lld",&u,&v,&z);
                add(u,v,z),add(v,u,0);
            }
            for(int i=1;i<=np;i++){
                while(getchar()!='(');
                scanf("%d%*c%lld",&u,&z);
                add(n,u,z),add(u,n,0);
            }
            for(int i=1;i<=nc;i++){
                while(getchar()!='(');
                scanf("%d%*c%lld",&u,&z);
                add(u,n+1,z),add(n+1,u,0);
            }
            Dinic(n,n+1);
            printf("%lld
    ",maxflow);
        }
        return 0;
    }
  • 相关阅读:
    一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
    210902
    1-2
    1-1
    4
    3
    2
    1
    u编码
    windows java 安装版 控制面板
  • 原文地址:https://www.cnblogs.com/helman/p/11295941.html
Copyright © 2020-2023  润新知