这道题让我涨姿势了

对于这类问题,我们称作最大权闭合图问题

就是每个点都有一个点权,要求选择一个点集,其中每个点的指向的点也在点集中,使这样一个点权和最大

对于这种问题,我们添加源点s,汇点t

对于点i,如果点权w是正的,我们连边s--->i,流量为w

如果点权w是负的,我们连边i--->t,流量为-w

然后我们我们原图中所有边流量设为inf即可

最后的答案=正点权和-最小割(最大流)

对于这道题,我们把用户和中转站看成点,

对于每个用户,我们显然要由它指向对应的两个中转站,然后做最大权闭合图即可

但是,这样做会tle,

分析一下,为什么呢?因为有多达50000个用户

再仔细观察题目,一共最多只有5000个中转站,

我们知道,最大流的效率取决于找增广路的效率

对于这幅图,我们不难发现,瓶颈边更容易出现在中转站一边

于是我们可以反向建图,这不改变网络的最小割,并且能大大减少增广的次数

反向建图是一个很重要的优化方法

 const inf=;
type node=record
       next,flow,point:longint;
     end; var edge:array[..] of node;
    p,h,numh,cur,pre:array[..] of longint;
    n,m,i,j,t,x,y,z,len,s:longint; function min(a,b:longint):longint;
  begin
    if a>b then exit(b) else exit(a);
  end; procedure add(x,y,f:longint);
  begin
    inc(len);
    edge[len].point:=y;
    edge[len].flow:=f;
    edge[len].next:=p[x];
    p[x]:=len;
  end; function sap:longint;
  var u,i,j,q,neck,tmp,s:longint;
  begin
    u:=;
    numh[]:=t+;
    sap:=;
    while h[]<t+ do
    begin
      if u=t then
      begin
        neck:=inf;
        i:=;
        while i<>t do
        begin
          j:=cur[i];
          if neck>edge[j].flow then
          begin
            neck:=edge[j].flow;
            s:=i;
          end;
          i:=edge[j].point;
        end;
        i:=;
        while i<>t do
        begin
          j:=cur[i];
          dec(edge[j].flow,neck);
          inc(edge[j xor ].flow,neck);
          i:=edge[j].point;
        end;
        sap:=sap+neck;
        u:=s;
      end;
      q:=-;
      i:=p[u];
      while i<>- do
      begin
        j:=edge[i].point;
        if (edge[i].flow>) and (h[u]=h[j]+) then
        begin
          q:=i;
          break;
        end;
        i:=edge[i].next;
      end;
      if q<>- then
      begin
        cur[u]:=i;
        pre[j]:=u;
        u:=j;
      end
      else begin
        dec(numh[h[u]]);
        if numh[h[u]]= then exit;
        tmp:=t+;
        i:=p[u];
        while i<>- do
        begin
          j:=edge[i].point;
          if edge[i].flow> then tmp:=min(tmp,h[j]);
          i:=edge[i].next;
        end;
        h[u]:=tmp+;
        inc(numh[h[u]]);
        if u<> then u:=pre[u];
      end;
    end;
  end; begin
  readln(n,m);
  t:=n+m+;
  len:=-;
  fillchar(p,sizeof(p),);
  for i:= to n do
  begin
    read(x);
    add(,i,x);
    add(i,,);
  end;
  for i:= to m do
  begin
    readln(x,y,z);
    s:=s+z;
    add(n+i,t,z);
    add(t,n+i,);
    add(x,n+i,inf);
    add(n+i,x,);
    add(y,n+i,inf);
    add(n+i,y,);
  end;
  writeln(s-sap);
end.

bzoj1497的更多相关文章

  1. 【bzoj1497】 NOI2006—最大获利

    http://www.lydsy.com/JudgeOnline/problem.php?id=1497 (题目链接) 题意 给出一个图,每一个点有一个负点权,每一条边有一个边权.选择某一条边的前提是 ...

  2. [bzoj1497][NOI2006]最大获利_网络流_最小割

    最大获利 bzoj-1497 题目大意:可以建立一个点,花费一定的代价:将已经建立的两个点之间连边,得到一定收益.有些节点之间是不允许连边的. 注释:1<=点数<=5,000,1<= ...

  3. BZOJ1497 [NOI2006]最大获利 网络流 最小割 SAP

    原文链接http://www.cnblogs.com/zhouzhendong/p/8371052.html 题目传送门 - BZOJ1497 题意概括 有n个站要被建立. 建立第i个站的花费为pi. ...

  4. 【BZOJ1497】【NOI2006】最大获利(网络流)

    [BZOJ1497][NOI2006]最大获利(网络流) 题面 BZOJ Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS& ...

  5. 【BZOJ1497】[NOI2006]最大获利 最小割

    裸的最小割,很经典的模型. 建图:要求总收益-总成本最大,那么将每条弧与源点相连,流量为成本,每个收益与汇点相连,流量为收益,然后每条弧与它所能到达的收益相连,流量为inf. 与源点相连的是未被选中的 ...

  6. BZOJ1497: [NOI2006]最大获利[最小割 最大闭合子图]

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4375  Solved: 2142[Submit][Status] ...

  7. 【BZOJ-1497】最大获利 最大流

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 3800  Solved: 1848[Submit][Status] ...

  8. Bzoj1497 [NOI2006]最大获利

    Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4449  Solved: 2181 Description 新的技术正冲击着手机通讯市场,对于各大运营商来 ...

  9. bzoj1497(最小割)

    传送门:最大获利 题意:建立n个中转站,每个花费P[i],有m个用户,使用Ai和Bi中转站可获利Ci,问最终建立哪几个中转站使获利最大? 分析:根据最大权闭合图建图,用户群和中转站为带权的点集,用户群 ...

随机推荐

  1. NSDate与 NSString 、long long类型的相互转化

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3560280.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  2. 支付宝api教程,支付宝根据交易号自动充值

    最近公司要用php做一个网站支付宝自动充值的功能,具体就是客户把钱直接转到公司的支付宝账号里,然后在我们网站上填写上交易号,我们网站程序自动获取交易信息,自动给网站的账户充值. 我的具体想法就是利用支 ...

  3. PHP扩展开发(1):入门

    有关PHP扩展开发的文章.博客已经很多了,比较经典的有: TIPI项目(http://www.php-internals.com/,强烈推荐) <Extending and Embedding ...

  4. 【仿携程JQuery日期价格表】

    今天比较闲所以就花点时间又写了点东西. 相信这种价格表大家不会陌生 现在我就模仿它做一个简单版本的.效果如下 首先需要两个时间控件,我这里用的是HTML5里面的时间控件,这个没限制喜欢用什么就用什么 ...

  5. Python3 多进程和多线程

    Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为 ...

  6. 控制 WAP 网站上输入框的默认类型

    比如手机号,卡输入框应该默认显示数字键盘,邮箱输入框应该默认显示邮箱键盘.www . c s d n 1 2 3 . com/html/itweb/20130802/36036_36043_36004 ...

  7. 遍历 DataSet

    DataSet ds=new DataSet ; //获取dataset的第一张table,取其他table只须改下标 DataTable dt=ds.tables[]; //遍历行 foreach( ...

  8. Missra开源前端框架

    Missra开源前端框架,官方网址:http://framework.missra.com

  9. Delphi新语法和ifthen的扩展联想

    Delphi之前已经重载了好多个ifthen函数 Math单元 ): Integer; overload; inline; ): Int64; overload; inline; ): UInt64; ...

  10. 常用PHP运行环境一键安装包

    PHP的程序很火,像博客:Wordpress.论坛:Discuz!.SNS:UCenter Home.CMS:DedeCMS等等都是比较流行的PHP程序,大家都在使用PHP类的程序,但对于很多初学者来 ...