这道题要谈很多;

首先,第一问等会我另外说一下;

第二问比较难想,首先我们的考虑两人的最优策略是什么

对于Bob,我们令分配了x条边的费用,则我们要最大化

ans=Σ(i=1 to x) flow[i] * p/x  (flow[i]为选择的边)

显然ans<=x*maxflow[i]*p/x=maxflow[i]*p

显然ans最大的方案就是将费用全部分配到实际流量最大的那条边上去

这样Alice的方案也明确了,就是在维持最大流不变的前提下,是实际流量最大的那条边最小

对于这类最小化最大的问题,我们不难想到二分答案,二分网络流上界流量

但请注意,有没有从题目保留的精度想到什么呢?

对,这道题流量可以是实数,

对于任意实数的网络流是不可做的,但是在一定精度范围内就照样可行;

照样就没什么问题了

这里说下我发现我以前写的最大流sap是不够好的

没加当前弧优化,之前很多题没TLE真是万幸;

在bzoj2127(之后放在一个专题写)中体现的特别明显,如果只用sap+gap妥妥TLE

用了之后1s多跑完……

这里给出最终的最大流写法(sap+gap+cur)

 const inf=;
      ok=1e-6;  //控制精读
type node=record
       next,point:longint;
       flow:double;
     end; var edge:array[..] of node;
    cur,numh,p,h,pre:array[..] of longint;
    w,x,y:array[..] of longint;
    d:array[..] of double;
    l,r,mid,ans1,ans2:double;
    t,len,i,n,m:longint; function min(a,b:double):double;
  begin
    if a>b then exit(b) else exit(a);
  end; procedure add(x,y:longint;f:double);
  begin
    inc(len);
    edge[len].flow:=f;
    edge[len].point:=y;
    edge[len].next:=p[x];
    p[x]:=len;
  end; function sap(k:double):double;  //带当前弧优化
  var u,i,j,tmp,q:longint;
      neck:double;
      flag:boolean;
  begin
    len:=-;
    fillchar(p,sizeof(p),);
    for i:= to m do
    begin
      add(x[i],y[i],min(k,w[i]));
      add(y[i],x[i],);
    end;
    fillchar(numh,sizeof(numh),);
    fillchar(h,sizeof(h),);
    numh[]:=n;
    u:=;
    neck:=inf;
    sap:=;
    cur:=p;
    while h[]<n do
    begin
      d[u]:=neck;
      flag:=false;
      i:=cur[u];
      while i<>- do
      begin
        j:=edge[i].point;
        if (edge[i].flow>) and (h[u]=h[j]+) then
        begin
          flag:=true;
          cur[u]:=i;
          pre[j]:=u;
          neck:=min(neck,edge[i].flow);
          u:=j;
          if u=n then
          begin
            sap:=sap+neck;
            while u<> do
            begin
              u:=pre[u];
              j:=cur[u];
              edge[j].flow:=edge[j].flow-neck;
              edge[j xor ].flow:=edge[j xor ].flow+neck;
            end;
            neck:=inf;  //勿忘1
          end;
          break;
        end;
        i:=edge[i].next;
      end;
      if not flag then
      begin
        dec(numh[h[u]]);
        if numh[h[u]]= then exit;
        tmp:=n;
        i:=p[u];
        q:=;
        while i<>- do
        begin
          j:=edge[i].point;
          if (tmp>h[j]) and (edge[i].flow>) then
          begin
            q:=i;
            tmp:=h[j];
          end;
          i:=edge[i].next;
        end;
        h[u]:=tmp+;
        cur[u]:=q;     //勿忘2
        inc(numh[h[u]]);
        if u<> then
        begin
          u:=pre[u];
          neck:=d[u];   //记录当前瓶颈边的作用
        end;
      end;
    end;
  end; begin
  readln(n,m,t);
  for i:= to m do
  begin
    readln(x[i],y[i],w[i]);
    if r<w[i] then r:=w[i];
  end;
  l:=;
  ans1:=sap(r);
  while r-l>ok do   //实数范围内的二分答案
  begin
    mid:=(l+r)/;
    if abs(ans1-sap(mid))<ok then r:=mid
    else l:=mid;
  end;
  writeln(ans1::);
  writeln(r*t::);
end.

bzoj3130的更多相关文章

  1. 【BZOJ3130】费用流(最大流,二分)

    [BZOJ3130]费用流(最大流,二分) 题面 Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一 ...

  2. 【二分答案】【最大流】bzoj3130 [Sdoi2013]费用流

    二分最大的边的cap,记作Lim. 把所有的边的cap设为min(Lim,cap[i]). Bob一定会把单位费用加到最大边上. #include<cstdio> #include< ...

  3. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 960  Solved: 5 ...

  4. BZOJ-3130 费用流 (听题目胡扯丶裸最大流) 二分判定+最大流+实数精度乱搞

    DCrusher爷喜欢A我做的水题,没办法,只能A他做不动的题了.... 3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec ...

  5. BZOJ3130 [Sdoi2013]费用流

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3130 这题codevs上也有,不过数据挂了[要A得看discuss]. 题目大意: Ali ...

  6. luogu3305/bzoj3130 费用流 (二分答案+dinic)

    Bob肯定想挑一个流量最大的边,然后把所有的费用都加给它呗 那Alice就让流量最大的边尽量小呗 那就二分一下答案再dinic呗 #include<bits/stdc++.h> #defi ...

  7. bzoj千题计划133:bzoj3130: [Sdoi2013]费用流

    http://www.lydsy.com/JudgeOnline/problem.php?id=3130 第一问就是个最大流 第二问: Bob希望总费用尽量大,那肯定是把所有的花费加到流量最大的那一条 ...

  8. 【bzoj3130】[Sdoi2013]费用流 二分+网络流最大流

    题目描述 Alice和Bob做游戏,给出一张有向图表示运输网络,Alice先给Bob一种最大流方案,然后Bob在所有边上分配总和等于P的非负费用.Alice希望总费用尽量小,而Bob希望总费用尽量大. ...

  9. BZOJ3130 [Sdoi2013]费用流 【网络流 + 二分】

    题目 Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络流方案必须满足:(1)每 ...

随机推荐

  1. textLayout在快速输入清除时报错解决方法

    var tf:TextFlow; var len:int = tf.numChildren;for (var i:int = 0; i < len; i += 1){ tf.removeChil ...

  2. ubuntu下boost的配置方法

    boost版本为: boost_1_52_0ubuntu版本为:ubuntu-12.04.1-desktop-i386 这里有两种安装方法: =============第一种: 也是最简单的:进入li ...

  3. MFC下拉框使用方法

    Combo Box (组合框)控件很简单,可以节省空间.从用户角度来看,这个控件是由一个文本输入控件和一个下拉菜单组成的.用户可以从一个预先定义的列表里选择一个选项,同时也可以直接在文本框里面输入文本 ...

  4. 深度模拟java动态代理实现机制系类之一

    上一篇博客是最基本的动态代理原理的实现,因为其固定了接口,固定了代理方法,以及固定了代理的类型,接下来的博客系类将一步步渐入深度介绍java的动态代理的实现原理 ******************* ...

  5. 算法之合并排序(mergeSort)

    合并排序算法在结构上是递归的,采用分治策略:就是将原有的问题划分为 n 个规模较小但结构与原问题相似的子问题,递归地解决这些子问题,然后合并其结果,就得到原问题的解. 合并排序的模式一般如下: 1.分 ...

  6. web api写api接口时返回

    web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法: 方法一:(改配置法) 找到Global.asax文件,在Applic ...

  7. 使用curl获取网站的http的状态码

    发布:thebaby   来源:net     [大 中 小] 本文分享一例shell脚本,一个使用curl命令获取网站的httpd状态码的例子,有需要的朋友参考下.本文转自:http://www.j ...

  8. Yii Query Builder insert()、update()、delete()使用

    Yii自带的query builder还是很好用的,省去了拼sql的过程,今天在写一个语句的时候遇到这样一个问题 $connection = Yii::app()->db; $command = ...

  9. 【6】了解Bootstrap栅格系统基础案例(1)

    从上一张我们了解了栅格选项,那么我们就来了实战了解下吧(其实还是中文官网的案例) ps.我这里是电脑上用谷歌浏览器来观察的,毕竟电脑的分辨率高(1440*900px),谷歌浏览器最大化后,值比大屏幕设 ...

  10. ARM的工作环境和工作模式

    工作环境: 可以称之为“数据环境,”数据总线16位或者32位,应用于不同的情况下.16位的情况下,工作速度快,代码密度高. 工作模式: 设置程序数据所处的状态,为移植操作系统提供方便.