zoukankan      html  css  js  c++  java
  • [NOI2006]最大获利

    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

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

    Sample Input

    5 5
    1 2 3 4 5
    1 2 3
    2 3 4
    1 3 3
    1 4 2
    4 5 3

    Sample Output

    4

    HINT

    【样例说明】选择建立1、2、3号中转站,则需要投入成本6,获利为10,因此得到最大收益4。【评分方法】本题没有部分分,你的程序的输出只有和我们的答案完全一致才能获得满分,否则不得分。【数据规模和约定】 80%的数据中:N≤200,M≤1 000。 100%的数据中:N≤5 000,M≤50 000,0≤Ci≤100,0≤Pi≤100。

    思路:最大权闭合子图

    s-(获利)>计划(m)-inf>中转站(n)-(投资)>t

    代码实现:

     1 #include<cstdio>
     2 #include<cstring>
     3 const int maxn=1e6;
     4 const int maxm=1e6;
     5 int n,m,s,t,ans;
     6 int a,b,c;
     7 int h[maxn],hs=1;
     8 int e_s[maxm],e_n[maxn],e_w[maxn];
     9 void add(int q,int z,int w){
    10     ++hs,e_s[hs]=z,e_n[hs]=h[q],e_w[hs]=w,h[q]=hs;
    11     ++hs,e_s[hs]=q,e_n[hs]=h[z],e_w[hs]=0,h[z]=hs;
    12 }
    13 inline int min_(int x,int y){return x<y?x:y;}
    14 void add(int q,int z){
    15     ++hs,e_s[hs]=z,e_w[hs]=1,e_n[hs]=h[q],h[q]=hs;
    16     ++hs,e_s[hs]=q,e_n[hs]=h[z],h[z]=hs;
    17 }
    18 int d[maxn],q[maxn],head,tail;
    19 void bfs(){
    20     memset(d,0,sizeof(d));
    21     head=tail=0;
    22     d[s]=1,q[head++]=s;
    23     while(head>tail){
    24         a=q[tail++];
    25         for(int i=h[a];i;i=e_n[i])
    26         if(!d[e_s[i]]&&e_w[i]){
    27             d[e_s[i]]=d[a]+1;
    28             if(e_s[i]==t) return;
    29             q[head++]=e_s[i];
    30         }
    31     }
    32 }
    33 int ap(int k,int nw){
    34     if(k==t) return nw;
    35     int bw=nw;
    36     for(int i=h[k];i&&bw;i=e_n[i])
    37     if(e_w[i]&&d[e_s[i]]==d[k]+1){
    38         int dw=ap(e_s[i],min_(bw,e_w[i]));
    39         if(dw) e_w[i]-=dw,e_w[i^1]+=dw,bw-=dw;
    40         else d[e_s[i]]=0;
    41     }
    42     return nw-bw;
    43 }
    44 void Dinic(){while(bfs(),d[t]) ans-=ap(s,0xffffff);}
    45 int main(){
    46     freopen("profit.in","r",stdin);
    47     freopen("profit.out","w",stdout);
    48     scanf("%d%d",&n,&m);
    49     s=0,t=n+m+1;
    50     for(int i=1;i<=n;i++){
    51         scanf("%d",&a);
    52         add(m+i,t,a);
    53     }
    54     for(int i=1;i<=m;i++){
    55         scanf("%d%d%d",&a,&b,&c);
    56         ans+=c;
    57         add(i,m+a,110);
    58         add(i,m+b,110);
    59         add(s,i,c);
    60     }
    61     Dinic();
    62     printf("%d
    ",ans);
    63     return 0;
    64 }
  • 相关阅读:
    安装lnmp 时如何修改数据库数据存储地址及默认访问地址
    ubuntu 设置root用户密码并实现root用户登录
    解决ubuntu 远程连接问题
    linux 搭建FTP服务器
    PHP 根据ip获取对应的实际地址
    如何发布自己的composer包
    使用composer安装composer包报Your requirements could not be resolved to an installable set of packages
    laravel 框架配置404等异常页面
    使用Xshell登录linux服务器报WARNING! The remote SSH server rejected X11 forwarding request
    IoTSharp 已支持国产松果时序数据库PinusDB
  • 原文地址:https://www.cnblogs.com/J-william/p/6798625.html
Copyright © 2011-2022 走看看