这两题本质是一致的;

一般来说,对于最长(短)化最短(长)的问题我们一般都使用二分答案+判定是否可行

因为这样的问题,我们一旦知道答案,就能知道全局信息

拿poj2455举例,对于二分出的一个答案,我们将不符合的边全部去掉,在做一遍最大流判断是否成立即可

注意这道题有重边,所以用链式前向星比较好(TT,当时我用的数组模拟邻接表表不要太烦)

 type node=record
       po,flow,cost:longint;
     end;
var w,ow:array[..,..] of node;
    cur,pre,numh,h,s,s0:array[..] of longint;
    ans,max,mid,l,r,x,y,z,i,n,m,p:longint; procedure add(x,y,z,f:longint);  //很繁琐的结构,需要检查好久,重边优先选择链式前向星,比较方便
  begin
    inc(s[x]);
    w[x,s[x]].po:=y;
    w[x,s[x]].cost:=z;
    w[x,s[x]].flow:=f;
  end; function maxflow(k:longint):boolean;  //很喜欢写sap,判定
  var j,sum,u,i,t,r,tmp:longint;
  begin
    max:=-;
    fillchar(pre,sizeof(pre),);
    fillchar(cur,sizeof(cur),);
    fillchar(h,sizeof(h),);
    fillchar(numh,sizeof(numh),);   //一定要注意,这句话没有不影响程序结果,但会拖慢程序速度(相当于没用到GAP优化),谨记
    fillchar(s0,sizeof(s0),);
    for i:= to n do
      for j:= to s[i] do
      begin
        if w[i,j].cost<=k then     //根据条件构造新图
        begin
          inc(s0[i]);
          ow[i,s0[i]]:=w[i,j];
        end;
      end;
    numh[]:=n;
    sum:=;
    u:=;
    while h[]<n do
    begin
      if u=n then
      begin
        i:=;
        while i<>n do
        begin
          t:=cur[i];
          if max<ow[i,t].cost then max:=ow[i,t].cost;  //小优化而已,在最大流里面找一条最大的边,实际上答案是这个
          dec(ow[i,t].flow);
          i:=ow[i,t].po;
        end;
        inc(sum);
        if sum=p then exit(true);
        u:=;
      end;
      r:=-;
      for i:= to s0[u] do
        if (ow[u,i].flow>) and (h[u]=h[ow[u,i].po]+) then
        begin
          r:=i;
          break;
        end;       if r<>- then
      begin
        cur[u]:=r;
        pre[ow[u,r].po]:=u;
        u:=ow[u,r].po;
      end
      else begin
        dec(numh[h[u]]);
        if numh[h[u]]= then exit(false);   
        tmp:=n;   //注意这里千万不要顺手打成maxlongint之类
        for i:= to s0[u] do
          if (ow[u,i].flow>) and (tmp>h[ow[u,i].po]) then tmp:=h[ow[u,i].po];
        h[u]:=tmp+;
        inc(numh[h[u]]);
        if u<> then u:=pre[u];
      end;
    end;
    exit(false);
  end; begin
  readln(n,m,p);
  for i:= to m do
  begin
    readln(x,y,z);
    add(x,y,z,);
    add(y,x,z,);
    if z>r then r:=z;
  end;
  l:=;
  while l<=r do
  begin
    mid:=(l+r) shr ;
    if maxflow(mid) then  
    begin
      ans:=max;   //小小的优化,但不是所有二分判定都可以用
      r:=max-;
    end
    else l:=mid+;
  end;
  writeln(ans);
end.

poj2391也是一样的,只不过多了floyd预处理

一般的,对于答案越大,决策就越有可能成功的这类具有单调性的题目,通常使用二分答案

poj2391,poj2455的更多相关文章

  1. Pyhton开源框架(加强版)

    info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...

  2. MPlayer

    名称   mplayer − 电影播放器 mencoder − 电影编解码器 概要   mplayer [选项] [文件|URL|播放列表|−] mplayer [选项] 文件1 [指定选项] [文件 ...

  3. python 爬取腾讯微博并生成词云

    本文以延参法师的腾讯微博为例进行爬取并分析 ,话不多说 直接附上源代码.其中有比较详细的注释. 需要用到的包有 BeautifulSoup WordCloud jieba # coding:utf-8 ...

  4. 面经 cisco

    1. 优先级反转问题及解决方法 (1)什么是优先级反转 简单从字面上来说,就是低优先级的任务先于高优先级的任务执行了,优先级搞反了.那在什么情况下会生这种情况呢? 假设三个任务准备执行,A,B,C,优 ...

  5. linux驱动(续)

    网络通信 --> IO多路复用之select.poll.epoll详解 IO多路复用之select.poll.epoll详解      目前支持I/O多路复用的系统调用有 select,psel ...

  6. HttpServletRequest对象(一)

    javaweb学习总结(十)——HttpServletRequest对象(一) 一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HT ...

  7. POJ2455 Secret Milking Machine【二分,最大流】

    题目大意:N个点P条边,令存在T条从1到N的路径,求路径上的边权的最大值最小为多少 思路:做了好多二分+最大流的题了,思路很好出 二分出最大边权后建图,跑dinic 问题是....这题是卡常数的好题! ...

  8. 【poj2455】 Secret Milking Machine

    http://poj.org/problem?id=2455 (题目链接) 题意 给出一张n个点,p条边的无向图,需要从1号节点走到n号节点一共T次,每条边只能经过1次,问T次经过的最大的边最小是多少 ...

  9. poj2391 Ombrophobic Bovines 拆点+二分法+最大流

    /** 题目:poj2391 Ombrophobic Bovines 链接:http://poj.org/problem?id=2391 题意:有n块区域,第i块区域有ai头奶牛,以及一个可以容纳bi ...

随机推荐

  1. 快速搭建Web环境 Angularjs + Express3 + Bootstrap3

    快速搭建Web环境 Angularjs + Express3 + Bootstrap3 AngularJS体验式编程系列文章, 将介绍如何用angularjs构建一个强大的web前端系统.angula ...

  2. The architecture of LTE network.

    3GPP定义的LTE网络架构结构变得扁平化,无线RNC/BSC 消失,只有eNodeB.控制面使用MME进行处理,用户面使用SGW和PGW进行处理.相比GSM和UMTS,在逻辑接口上定义了S1/X2逻 ...

  3. [python] 字符串引用

    %s str %d 整数 %f 浮点数 print('$%.03f' % 30.1777) >>>$30.178  #四舍五入 print( '%-5s %s %10s' % ('J ...

  4. matlab之点运算基本思想及几何平移变换

    1.对数变换可以增强图像中较暗部分的细节,因为对数可以将较小的值放大,而较大的值缩小 2.伽马变换:y = (x + esp) ^ γ,x,y的取值范围是0到1,esp是补偿系数,γ为伽马系数.γ的不 ...

  5. PAT乙级真题1004. 成绩排名 (20)(解题)

    题目: 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第 ...

  6. 2014年辛星完全解读Javascript第七节 数组和对象

    由于Javascript是脚本语言,因此,使用起来非常方便,数组的使用也是比较简单的,下面我们就主要介绍一下Javascript中数组的介绍,以及上一节中没有完成的对象的介绍. *********** ...

  7. hadoop可能遇到的问题

    1.hadoop运行的原理? 2.mapreduce的原理? 3.HDFS存储的机制? 4.举一个简单的例子说明mapreduce是怎么来运行的 ? 5.面试的人给你出一些问题,让你用mapreduc ...

  8. python学习笔记2(变量)

    变量是只不过保留的内存位置用来存储值,这意味着,当创建一个变量,那么它在内存中保留一些空间. Python是弱类型,无需明确指定变量类型,赋值的同时会自动声明类型. x = 1 y = 2.0 nam ...

  9. DB天气app冲刺第十一天

    今天是第十一天了.今天遇到了一个很麻烦的问题 就是程序好好的然后调试运行之后能够安装成功 但总是运行不了 一直闪退.最主要的问题是代码还没有问题,这是最让人揪心的一个问题了.因为有bug的话还可以改, ...

  10. Linux find example

    find | xargs echo >> x1 find -exec echo {} \; >> x2 1.查找/var目录下属主为root并且属组为mail的所有文件:fin ...