• poj1459(多源点网络流)


    题意:有n个点,np个供电点,nc个消费点,m条线路,接来题目先给出的是m条带权路径,然后是np个供电点和权值,接着就是nc个消费点和权值。 
    题目要我们求出给定的图最大能消费的总电量(就是求最大流)

    思路:建一个超级源点,一个超级汇点。超级源点连接所以供电站,所以消费点连接超级汇点。跑一遍网络流即可。

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    
    struct node{
        int c,f;
    }mp[310][310];
    int sx,ex,n,m,np,nc;
    int pre[310];
    
    
    bool bfs()
    {
        memset(pre,0,sizeof(pre));
        pre[sx]=1;
        queue<int> q;
        q.push(sx);
        while(!q.empty())
        {
            int p=q.front();
            q.pop();
            for(int i=0;i<=n+1;i++)
            {
                if(!pre[i]&&mp[p][i].c-mp[p][i].f)
                {
                    pre[i]=pre[p]+1;
                    q.push(i);
                }
            }
        }
        return pre[ex]!=0;
    }
    
    int dinic(int pos,int flow)
    {
        int f=flow;
        if(pos==ex)
               return flow;
        for(int i=0;i<=n+1;i++)
        {
            if(mp[pos][i].c-mp[pos][i].f&&pre[pos]+1==pre[i])
            {
                int a=mp[pos][i].c-mp[pos][i].f;
                int t=dinic(i,min(a,flow));
                mp[pos][i].f+=t;
                mp[i][pos].f-=t;
                flow-=t;
            }
        }
        return f-flow;
    }
    
    int solve()
    {
        int sum=0;
        while(bfs())
        {
            sum+=dinic(sx,inf);
        }
        return sum;
    }
    
    int main()
    {
        while(cin>>n>>np>>nc>>m)
        {
            int st,ed,v;
            char f;
            sx=n;ex=n+1;
            memset(mp,0,sizeof(mp));
            for(int i=1;i<=m;i++)
            {
                cin>>f>>st>>f>>ed>>f>>v;
                if(st==ed)
                    continue;
                mp[st][ed].c+=v;    
            }
            for(int i=1;i<=np;i++)
            {
                cin>>f>>st>>f>>v;
                mp[sx][st].c+=v;
            }
            for(int i=1;i<=nc;i++)
            {
                cin>>f>>ed>>f>>v;
                mp[ed][ex].c+=v;
            }
            cout<<solve()<<endl;
        }    
        return 0;
    }
  • 相关阅读:
    图像的纹理分析
    图像的小波变换
    图像的哈尔变换
    图像的K-L变换
    图像的斜变换
    图像的波尔什-哈达玛变换
    今日心得:给自己写信
    今日心得:人的幸福感取决于什么?
    今日心得:人生就像一杯茶,不会苦一辈子但会苦一阵子
    今日心得:纪念徐志摩117周年
  • 原文地址:https://www.cnblogs.com/xiongtao/p/11137771.html
Copyright © 2020-2023  润新知