zoukankan      html  css  js  c++  java
  • poj 1495 Power Network dinic()

    题目链接:Power Network

    题意:总共N个点np个发电站,nc个用户,m条边。给出点的链接方式,和边的权值。问从发电站出发最多能有多少电量传到用户。

    题解:创建一个源点与所有的发电站建边,创建一个汇点与所有的用户建边,然后求源点到汇点的最大流。

    //#include<bits/stdc++.h>
    #include<iostream>
    #include<cstring>
    #include <cstdlib>
    #include<queue>
    #define min(a,b) a<b?a:b
    #define pb push_back
    #define ll long long
    #define PI 3.14159265
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define eps 1e-7
    const int inf=0x7fffffff;
    const int maxn=2e2+5;
    using namespace std;
    int dis[maxn];
    int tic[110][110];
    int n,np,nc,m;
    bool bfs()
    {
        int s;
        memset(dis,0xff,sizeof(dis));
        dis[0]=0;
        queue<int>q;
        q.push(0);
        while(!q.empty())
        {
            s=q.front();q.pop();
            for(int i=0;i<=n+1;i++)
            {
                if(dis[i]<0&&tic[s][i]>0)
                {
                    dis[i]=dis[s]+1;
                    q.push(i);
                }
            }
        }
        if(dis[n+1]>0)return true;
        else return false;
    }
    int dfs(int v,int low)
    {
        int a;
        if(v==n+1)return low;
        for(int i=0;i<=n+1;i++)
        {
            if(tic[v][i]>0&&dis[i]==dis[v]+1&&(a=dfs(i,min(low,tic[v][i]))))
            {
                tic[v][i]-=a;
                tic[i][v]+=a;
                return a;
            }
        }
        return 0;
    }
    int dinic()
    {
        int ans=0;
        while(bfs())
        {
            int tmp;
            while(tmp=dfs(0,inf))
            {ans+=tmp;}
        }
        return ans;
    }
    int main()
    {
        std::ios::sync_with_stdio(false);
    	cin.tie(0);
    	cout.tie(0);
    	while(cin>>n>>np>>nc>>m)
        {
            memset(tic,0,sizeof(tic));
            while(m--)
            {
                int from,to,c;
                char a;
                cin>>a>>from>>a>>to>>a>>c;
                tic[++from][++to]+=c;
            }
            while(np--)
            {
                int from,to,c;
                char a;
                cin>>a>>from>>a>>c;
                tic[0][++from]+=c;
            }
            while(nc--)
            {
                int from,to,c;
                char a;
                cin>>a>>from>>a>>c;
                tic[++from][n+1]+=c;
            }
            cout<<dinic()<<endl;
        }
    }
    
  • 相关阅读:
    清除图片周围的空白区域
    试题识别与生成
    需要继续研究
    工作中的必要举措
    教学云平台要求的硬件配置
    处理程序安装部署标准流程
    Node.js 回调函数
    git 学习
    在 Selenium 中让 PhantomJS 执行它的 API
    RF常用库简介(robotframework)
  • 原文地址:https://www.cnblogs.com/lhclqslove/p/7816135.html
Copyright © 2011-2022 走看看