zoukankan      html  css  js  c++  java
  • bzoj1497 最大获利

    Description

    新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战。THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研究、站址勘测、最优化等项目。在前期市场调查和站址勘测之后,公司得到了一共N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第i个通讯中转站需要的成本为Pi(1≤i≤N)。另外公司调查得出了所有期望中的用户群,一共M个。关于第i个用户群的信息概括为Ai, Bi和Ci:这些用户会使用中转站Ai和中转站Bi进行通讯,公司可以获益Ci。(1≤i≤M, 1≤Ai, Bi≤N) THU集团的CS&T公司可以有选择的建立一些中转站(投入成本),为一些用户提供服务并获得收益(获益之和)。那么如何选择最终建立的中转站才能让公司的净获利最大呢?(净获利 = 获益之和 - 投入成本之和)

    Input

    输入文件中第一行有两个正整数N和M 。第二行中有N个整数描述每一个通讯中转站的建立成本,依次为P1, P2, …, PN 。以下M行,第(i + 2)行的三个数Ai, Bi和Ci描述第i个用户群的信息。所有变量的含义可以参见题目描述。

    Output

    你的程序只要向输出文件输出一个整数,表示公司可以得到的最大净获利。

    最大权闭合子图转化为最小割转化为最大流求解

    #include<cstdio>
    #include<cstring>
    const int inf=0x3fffffff;
    const int N=400000;
    int es[N],enx[N],ev[N],ep=55004;
    int h[55005];
    void addedge(int a,int b,int v){
        es[ep]=b;
        ev[ep]=v;
        enx[ep]=enx[a];
        enx[a]=ep++;
        es[ep]=a;
        ev[ep]=0;
        enx[ep]=enx[b];
        enx[b]=ep++;
    }
    int n,m,a,b,c,S,T,ans=0;
    int q[N];
    bool bfs(){
        memset(h,-1,sizeof(h));
        int ql=0,qr=0,w;
        q[qr++]=S;
        h[S]=0;
        while(ql<qr){
            w=q[ql++];
            for(int i=enx[w];i;i=enx[i]){
                int u=es[i];
                if(ev[i]&&!~h[u])h[q[qr++]=u]=h[w]+1;
            }
        }
        return ~h[T];
    }
    int dfs(int w,int f){
        if(w==T)return f;
        int c,used=0;
        for(int i=enx[w];i;i=enx[i]){
            int u=es[i];
            if(h[u]!=h[w]+1||!ev[i])continue;
            c=f-used;
            if(c>ev[i])c=ev[i];
            c=dfs(u,c);
            ev[i]-=c;
            ev[i^1]+=c;
            used+=c;
        }
        if(!used)h[w]=-1;
        return used;
    }
    int main(){
        scanf("%d%d",&n,&m);
        S=0;T=n+m+1;
        for(int i=1;i<=n;i++){
            scanf("%d",&a);
            addedge(i,T,a);
        }
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&a,&b,&c);
            ans+=c;
            addedge(S,i+n,c);
            addedge(i+n,a,inf);
            addedge(i+n,b,inf);
        }
        while(bfs())ans-=dfs(S,inf);
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    如何关闭和打开oracle 10g自动收集统计信息功能
    ORA00600:internal error code,arguments
    ORA01033: ORACLE initialization or shutdown in progress
    ORA01652:unable to extend temp segment by num in tablespace name
    ORA01578:Oracle data block corrupted
    ORA03113:endoffile on communication channel
    ORA01650:unable to extend rollback segment NAME by NUM intablespace NAME
    ORA01628:max # of extents num reached for rollback segment num
    C# 项目中的 bin 目录和 obj 目录的区别,以及 Debug 版本和 Release 版本的区别
    管理 Hadoop 集群的5大工具
  • 原文地址:https://www.cnblogs.com/ccz181078/p/5173462.html
Copyright © 2011-2022 走看看