<题目链接>

题目大意:

FJ有N块地,这些地之间有P条双向路,每条路的都有固定的长度l。现在要你找出从第1块地到第n块地的T条不同路径,每条路径上的路段不能与先前的路径重复,问这些路径中的最长路段的最小值是多少。

解题分析:

最小的最大值问题,依然需要用二分答案,枚举出该最大路段的长度,然后将所有小于等于这个值得路段加入网络,将这些路段的容量置为1。因为是无向图,所以正、反向弧的容量都置为1,之后跑一遍最大流,再根据最大流和T的大小关系来判断。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. #define INF 0x3f3f3f3f
  8. #define mem(a,b) memset(a,b,sizeof(a))
  9. const int N=;
  10.  
  11. struct Edge{
  12. int u,v,c;
  13. }edge[N*N*];
  14.  
  15. struct Segment{
  16. int a,b,len;
  17. }seg[N*N];
  18.  
  19. int d[N],cur[N];
  20. int head[N],next[N*N*];
  21. int n,m,k,maxlen,minlen,cnt;
  22.  
  23. void addedge(int u,int v,int w){
  24. edge[cnt].u=u;edge[cnt].v=v,edge[cnt].c=w;
  25. next[cnt]=head[u],head[u]=cnt++;
  26.  
  27. edge[cnt].u=v;edge[cnt].v=u,edge[cnt].c=w;
  28. next[cnt]=head[v],head[v]=cnt++;
  29. }
  30.  
  31. int bfs(int s,int t){
  32. queue<int> q;
  33. mem(d,);
  34. d[s]=;
  35. q.push(s);
  36. while(!q.empty()){
  37. int x=q.front();q.pop();
  38. for(int i=head[x];i!=-;i=next[i]){
  39. if(edge[i].c> && !d[edge[i].v]){
  40. d[edge[i].v]=d[x]+;
  41. q.push(edge[i].v);
  42. }
  43. }
  44. }
  45. return d[t];
  46. }
  47.  
  48. int dfs(int x,int a){
  49. if(x==n || a==)return a;
  50. int t,f,flow=;
  51. for(int& i=cur[x];i!=-;i=next[i]){
  52. if(d[x]+==d[edge[i].v] && (f=dfs(edge[i].v,min(a,edge[i].c)))>){
  53. edge[i].c-=f;
  54. edge[i^].c+=f;
  55. flow+=f;
  56. a-=f;
  57. if(!a)break;
  58. }
  59. }
  60. return flow;
  61. }
  62.  
  63. int dinic(int s,int t,int limit){
  64. int i,ret=;
  65. while(bfs(s,t)){
  66. for(i=;i<=n;i++)cur[i]=head[i];
  67. ret+=dfs(s,INF);
  68. }
  69. return ret;
  70. }
  71.  
  72. int binary_solve(){
  73. int low=minlen,high=maxlen;
  74. while(low<high){ //这个二分答案部分对格式还是有点疑惑
  75. int mid=(low+high)>>;
  76. cnt=;mem(head,-); //init()
  77. for(int i=;i<m;i++) //加入所有满足要求的边
  78. if(seg[i].len<=mid)
  79. addedge(seg[i].a,seg[i].b,);
  80. int t=dinic(,n,mid);
  81. if(t<k)low=mid+;
  82. else high=mid;
  83. }
  84. return low;
  85. }
  86.  
  87. int main(){
  88. while(~scanf("%d%d%d",&n,&m,&k)){
  89. maxlen=-INF;minlen=INF;
  90. for(int i=;i<m;i++){
  91. scanf("%d%d%d",&seg[i].a,&seg[i].b,&seg[i].len);
  92. maxlen=max(maxlen,seg[i].len);
  93. minlen=min(minlen,seg[i].len);
  94. }
  95. printf("%d\n",binary_solve());
  96. }
  97. return ;
  98. }

2018-11-24

POJ 2455 Secret Milking Machine 【二分】+【最大流】的更多相关文章

  1. POJ 2455 Secret Milking Machine (二分 + 最大流)

    题目大意: 给出一张无向图,找出T条从1..N的路径,互不重复,求走过的所有边中的最大值最小是多少. 算法讨论: 首先最大值最小就提醒我们用二分,每次二分一个最大值,然后重新构图,把那些边权符合要求的 ...

  2. poj 2455 Secret Milking Machine 二分+最大流 sap

    题目:p条路,连接n个节点,现在需要从节点1到节点n,不重复走过一条路且走t次,最小化这t次中连接两个节点最长的那条路的值. 分析:二分答案,对于<=二分的值的边建边,跑一次最大流即可. #in ...

  3. POJ 2455 Secret Milking Machine(最大流+二分)

    Description Farmer John is constructing a new milking machine and wishes to keep it secret as long a ...

  4. POJ 2455 Secret Milking Machine (二分+无向图最大流)

    [题意]n个点的一个无向图,在保证存在T条从1到n的不重复路径(任意一条边都不能重复)的前提下,要使得这t条路上经过的最长路径最短. 之所以把"经过的最长路径最短"划个重点是因为前 ...

  5. POJ 2455 Secret Milking Machine(搜索-二分,网络流-最大流)

    Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9658   Accepted: ...

  6. POJ 2455 - Secret Milking Machine

    原题地址:http://poj.org/problem?id=2455 题目大意:给出一个N个点的无向图,中间有P条边,要求找出从1到n的T条通路,满足它们之间没有公共边,并使得这些通路中经过的最长的 ...

  7. POJ 2112 Optimal Milking(二分+最大流)

    http://poj.org/problem?id=2112 题意: 现在有K台挤奶器和C头奶牛,奶牛和挤奶器之间有距离,每台挤奶器每天最多为M头奶挤奶,现在要安排路程,使得C头奶牛所走的路程中的最大 ...

  8. POJ - 2112 Optimal Milking (dijkstra + 二分 + 最大流Dinic)

    (点击此处查看原题) 题目分析 题意:在一个农场中有k台挤奶器和c只奶牛,每个挤奶器最多只能为m只奶牛挤奶,每个挤奶器和奶牛都视为一个点,将编号1~k记为挤奶器的位置,编号k+1~k+c记为奶牛的位置 ...

  9. POJ 2112 Optimal Milking (Floyd+二分+最大流)

    [题意]有K台挤奶机,C头奶牛,在奶牛和机器间有一组长度不同的路,每台机器每天最多能为M头奶牛挤奶.现在要寻找一个方案,安排每头奶牛到某台机器挤奶,使得C头奶牛中走过的路径长度的和的最大值最小. 挺好 ...

随机推荐

  1. 姿势摆好,一招学会android的布局优化!

    作为android应用来讲,无论应用本身多么美观,功能多么强大,内容多么丰富.但如果App本身打开界面缓慢超过手机16ms刷新一次页面的时间,就会产生卡顿.用户体验都会变得极差,导致用户量减少.所以我 ...

  2. 使用Eclipse进行Makefile项目

    最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关在Eclipse中使用Makefile创建项目的文章,文章讲解清晰明了非常不错,所以呢没人将其翻译过来供各位同仁参考. ...

  3. Windows下Oracle 11g创建数据库

    以前开发的时候用得比较多的是mysql和sql server,oracle用的比较少,用起来比较生疏,mysql和sql server用起来比较类似,就oracle的使用方式和他们不同,oracle在 ...

  4. npm安装依赖包 --save-dev 和 --save; package.json的devDependencies和dependencies 的区别!

    以前一直在纠结一个npm安装的包依赖管理的问题.是这样的: 我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,他们是:--save- ...

  5. IE11总是有缓存的问题

    F12,里面选择网络,始终从服务器刷新..

  6. laravel 容器注入的坑

    今天遍历添加数据时遇到个坑,哪位大神知道什么原因?? 起初的代码是这样的:(部分) public function addActive(Request $request, Activenorms $a ...

  7. Allegro PCB Design GXL (legacy) 设置十字大光标

    Allegro PCB Design GXL (legacy) version 16.6-2015 1.菜单:Setup > User Preferences... 2.User Prefere ...

  8. JS实现继承的几种方式(转)

    转自:幻天芒的博客 前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如 ...

  9. js cookie 工具

    var CookieUtil = { get: function(name) { var cookieName = encodeURIComponent(name) + "=", ...

  10. 010-Python-socket编程

    客户端/服务器的架构 物理层:网卡,光缆,双绞线 数据链路层:包含源mac地址和目标的mac地址,通过广播通讯 网络层:跑的IP协议,IP地址可以定义到一个子网:通过ARP协议可以解析为mac地址: ...