• poj-1459(网络流-最大流)


    题意:给你n个点的电网系统,有一些点是电站,能提供p的电能,有些点是用户,能消耗c的电能,有些是过渡站,不消耗不产生(等于没用),然后m条电线(x,y,w),代表x可以向y运输w的电能,问你这个电网系统最多消耗多少电能

    解题思路:题目好乱。。。其实就是一个最大流的板子题,电站提供的作为初始流量,用户消耗的和电线运输的代表容量,然后建立一个源点,汇点跑最大流就可以了;也就输入看的烦人;

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #define inf 0x3f3f3f3f
    #define maxn 100500
    using namespace std;
    struct Edge
    {
        int fa;
        int next;
        int to;
        int w;
    }edge[maxn];
    int n,m;
    int head[maxn];
    int cnt,Start,End;
    int depth[maxn];
    void add(int u,int v,int w)
    {
        edge[cnt].next=head[u];edge[cnt].fa=u;
        edge[cnt].to=v;edge[cnt].w=w;head[u]=cnt++;
        edge[cnt].next=head[v];edge[cnt].fa=v;
        edge[cnt].to=u;edge[cnt].w=0;head[v]=cnt++;
    }
    bool bfs()//分层;
    {
        memset(depth,0,sizeof(depth));
        queue<int>q;
        q.push(Start);
        depth[Start]=1;
        while(!q.empty())
        {
            int temp=q.front();
            q.pop();
            for(int i=head[temp];i!=-1;i=edge[i].next)
            {
                int v=edge[i].to;
                if(depth[v]||edge[i].w<=0)
                    continue;
                depth[v]=depth[temp]+1;
                q.push(v);
            }
        }
        return depth[End];//若为0表示没法到达也就是没有路径了;
    }
    int dfs(int u,int maxflow)
    {
        if(u==End)
            return maxflow;
        int add=0;
        for(int i=head[u];i!=-1&&add<maxflow;i=edge[i].next)
        {
            int v=edge[i].to;
            if(depth[v]!=depth[u]+1)
                continue;
            if(edge[i].w==0)
                continue;
            int tempflow=dfs(v,min(edge[i].w,maxflow-add));
            edge[i].w-=tempflow;
            edge[i^1].w+=tempflow;
            add+=tempflow;
        }
        return add;
    }
    int dinic()
    {
        int ans=0;
        while(bfs())
        {
            ans+=dfs(Start,0x3f3f3f3f);
        }
        return ans;
    }
    int main()
    {
        int x,y,w;
        int np,nc;
    
        char s[20];
        while(cin>>n>>np>>nc>>m)
        { Start=n+1;End=n+2;
            memset(head,-1,sizeof(head));
            cnt=0;
            for(int i=1;i<=m;i++)
            {
                cin>>s[1];cin>>x;cin>>s[2];cin>>y;cin>>s[3];cin>>w;
               // cout<<x<<y<<w<<endl;
                add(x,y,w);
            }
            for(int i=1;i<=np;i++)
            {
                cin>>s[1];cin>>x;cin>>s[2];cin>>w;
               // cout<<Start<<x<<w<<endl;
                add(Start,x,w);
            }
            for(int i=1;i<=nc;i++)
            {
                cin>>s[1];cin>>x;cin>>s[2];cin>>w;
               // cout<<x<<End<<w<<endl;
                add(x,End,w);
            }
            int ans=dinic();
            cout<<ans<<endl;
        }
    }
    

      

    代码:

  • 相关阅读:
    采用重写tostring方法使ComboBox显示对象属性
    JavaScript中正则表达式test()、exec()、match() 方法
    高级软件工程实践总结作业
    用户使用调查报告
    Beta阶段置顶集合
    Beta冲刺阶段总结随笔
    Beta冲刺Day7
    Beta冲刺Day6
    Beta冲刺Day5
    Beta冲刺Day4
  • 原文地址:https://www.cnblogs.com/huangdao/p/9313605.html
Copyright © 2020-2023  润新知