zoukankan      html  css  js  c++  java
  • poj1459

     http://poj.org/problem?id=1459

    题意:多组测试数据,每组测试数据给出N,Np,Nc,M。N代表结点数量,M代表边的数量,Np代表结点中电站的数量(只产电,不耗电),Nc代表消费者数量(只耗电,不产电),其他结点代表中转站(不产电,不耗电)。
    接着M组(u,v)w数据,代表u到v容量为w,接着Np组(u)w,代表结点u产电w,接着Nc组(u)w,代表结点u耗电w。
    求电网中能消耗的最大电能值。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    
    using namespace std;
    inline int read(){
        int sum=0,x=1;
        char ch=getchar();
        while(ch<'0'||ch>'9'){
            if(ch=='-')
                x=0;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')
            sum=(sum<<1)+(sum<<3)+(ch^48),ch=getchar();
        return x?sum:-sum;
    }
    inline void write(int x){
        if(x<0)
            putchar('-'),x=-x;
        if(x>9)
            write(x/10);
        putchar(x%10+'0');
    }
    const int M=105;
    const int N=20500;
    const int inf=0x3f3f3f3f;
    struct node{
        int v,w,nextt;
    }e[N];
    int tot,s,t,n,np,nc,m;
    int deep[M],cur[M],head[M];
    void addedge(int u,int v,int w){
        e[tot].v=v;
        e[tot].w=w;
        e[tot].nextt=head[u];
        head[u]=tot++;
        e[tot].v=u;
        e[tot].w=0;
        e[tot].nextt=head[v];
        head[v]=tot++;
    }
    
    bool bfs(){
        for(int i=0;i<=t;i++)
            deep[i]=0;
        queue<int>que;
        que.push(s);
        deep[s]=1;
        while(!que.empty()){
            int u=que.front();
            que.pop();
            for(int i=head[u];~i;i=e[i].nextt){
                int v=e[i].v;
                if(e[i].w>0&&deep[v]==0){
                    deep[v]=deep[u]+1;
                    if(v==t)
                        return true;
                    que.push(v);
                }
            }
        }
        return deep[t]!=0;
    }
    int dfs(int u,int fl){
        if(u==t)
            return fl;
        int x=0,ans=0;
        for(int i=cur[u];~i;i=e[i].nextt){
            int v=e[i].v;
            if(e[i].w>0&&deep[v]==deep[u]+1){
                int x=dfs(v,min(fl-ans,e[i].w));
                e[i].w-=x;
                e[i^1].w+=x;
                if(e[i].w)
                    cur[u]=i;
                ans+=x;
                if(ans==fl)
                    return ans;
            }
        }
        if(ans==0)
            deep[u]=0;
        return ans;
    }
    int dinic(){
        int ans=0;
        while(bfs()){
            for(int i=0;i<=t;i++)
                cur[i]=head[i];
            ans+=dfs(s,inf);
        }
        return ans;
    }
    void init(){
        tot=0;s=0,t=n+1;
        for(int i=0;i<=t;i++)
            head[i]=-1;
        
    }
    int main(){
        while(~scanf("%d%d%d%d",&n,&np,&nc,&m)){
            init();
            int u,v,w;
            while(m--){
                while(getchar()!='(');
                scanf("%d,%d)%d",&u,&v,&w);
                u++,v++;
                addedge(u,v,w);
            }
            
            while(np--){
                while(getchar()!='(');
                scanf("%d)%d",&v,&w);
                v++;
                addedge(s,v,w);
            }
        //    cout<<"!!"<<endl;
            while(nc--){
                while(getchar()!='(');
                scanf("%d)%d",&u,&w);
                u++;
                addedge(u,t,w);
            }
            write(dinic());
            putchar('
    ');
            
        }
        return 0;
    }
    View Code
  • 相关阅读:
    远程推送(个推)
    transform3D实现翻页效果
    启发式搜索 A*算法的OC 实现
    IOS 高级开发 KVC(二)
    IOS 高级开发 KVC(一)
    IOS 应用程序启动加载过程(从点击图标到界面显示)
    堆排序的OC实现
    iOS 高级开发 runtime(三)
    IOS 高级开发 runtime(二)
    RxSwift
  • 原文地址:https://www.cnblogs.com/starve/p/10989477.html
Copyright © 2011-2022 走看看