题目描述

Alice和Bob做游戏,给出一张有向图表示运输网络,Alice先给Bob一种最大流方案,然后Bob在所有边上分配总和等于P的非负费用。Alice希望总费用尽量小,而Bob希望总费用尽量大。求两人都采取最优策略的情况下最大流及总费用。

输入

第一行三个整数N,M,P。N表示给定运输网络中节点的数量,M表示有向边的数量,P的含义见问题描述部分。为了简化问题,我们假设源点S是点1,汇点T是点N。
接下来M行,每行三个整数A,B,C,表示有一条从点A到点B的有向边,其最大流量是C。

输出

第一行一个整数,表示最大流的值。
第二行一个实数,表示总费用。建议选手输出四位以上小数。

样例输入

3 2 1
1 2 10
2 3 15

样例输出

10
10.000


题解

二分+网络流最大流

显然对于Alice给出的一种方案,Bob只需要在流量最大的边上设置费用P,其它边费用为0,即可使费用最大。

所以Alice要使费用尽量小,就需要使流量最大的边的流量最小。

先跑一遍最大流得出第一问的答案。然后二分最大流量,对于一条边,将其容量设置为 min(原图中流量,mid) ,跑最大流,如果最大流等于原图的最大流则可行,否则不可行。

最后的答案就是mid*P。

我才不会告诉你们第二问puts("nan")可过呢

  1. #include <queue>
  2. #include <cstdio>
  3. #include <cstring>
  4. #define N 110
  5. #define M 2010
  6. using namespace std;
  7. queue<int> q;
  8. int m , px[M] , py[M] , head[N] , to[M] , next[M] , cnt , s , t , dis[N];
  9. double pz[M] , val[M];
  10. inline void add(int x , int y , double z)
  11. {
  12. to[++cnt] = y , val[cnt] = z , next[cnt] = head[x] , head[x] = cnt;
  13. to[++cnt] = x , val[cnt] = 0 , next[cnt] = head[y] , head[y] = cnt;
  14. }
  15. bool bfs()
  16. {
  17. int x , i;
  18. memset(dis , 0 , sizeof(dis));
  19. while(!q.empty()) q.pop();
  20. dis[s] = 1 , q.push(s);
  21. while(!q.empty())
  22. {
  23. x = q.front() , q.pop();
  24. for(i = head[x] ; i ; i = next[i])
  25. {
  26. if(val[i] && !dis[to[i]])
  27. {
  28. dis[to[i]] = dis[x] + 1;
  29. if(to[i] == t) return 1;
  30. q.push(to[i]);
  31. }
  32. }
  33. }
  34. return 0;
  35. }
  36. double dinic(int x , double low)
  37. {
  38. if(x == t) return low;
  39. double temp = low , k;
  40. int i;
  41. for(i = head[x] ; i ; i = next[i])
  42. {
  43. if(val[i] && dis[to[i]] == dis[x] + 1)
  44. {
  45. k = dinic(to[i] , min(temp , val[i]));
  46. if(!k) dis[to[i]] = 0;
  47. val[i] -= k , val[i ^ 1] += k;
  48. if(!(temp -= k)) break;
  49. }
  50. }
  51. return low - temp;
  52. }
  53. double solve(double mid)
  54. {
  55. int i;
  56. double ans = 0;
  57. memset(head , 0 , sizeof(head)) , cnt = 1;
  58. for(i = 1 ; i <= m ; i ++ ) add(px[i] , py[i] , min(pz[i] , mid));
  59. while(bfs()) ans += dinic(s , 1e9);
  60. return ans;
  61. }
  62. int main()
  63. {
  64. int n , i , cnt = 50;
  65. double l = 0 , r = 1e9 , mid , flow , p;
  66. scanf("%d%d%lf" , &n , &m , &p) , s = 1 , t = n;
  67. for(i = 1 ; i <= m ; i ++ ) scanf("%d%d%lf" , &px[i] , &py[i] , &pz[i]);
  68. printf("%.0lf\n" , flow = solve(1e9));
  69. while(cnt -- )
  70. {
  71. mid = (l + r) / 2;
  72. if(solve(mid) == flow) r = mid;
  73. else l = mid;
  74. }
  75. printf("%.4lf\n" , r * p);
  76. return 0;
  77. }

【bzoj3130】[Sdoi2013]费用流 二分+网络流最大流的更多相关文章

  1. 【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流

    题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线 ...

  2. 【bzoj1733】[Usaco2005 feb]Secret Milking Machine 神秘的挤奶机 二分+网络流最大流

    题目描述 Farmer John is constructing a new milking machine and wishes to keep it secret as long as possi ...

  3. 【bzoj1532】[POI2005]Kos-Dicing 二分+网络流最大流

    题目描述 Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一个俱乐部. 俱乐部的人时常在一起玩这个游戏然后评选出玩得最好的人.现在有一个非常不走运的 ...

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

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

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

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

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

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

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

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

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

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

  9. BZOJ3130: [Sdoi2013]费用流(二分,最大流)

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

随机推荐

  1. 图解Oracle下建立tnsname

    第一步:运行netca: 第二步: 第三步: 第四步: 第五步: 第六步: 如果前面设置都正确,测试的结果将正常(前提是Database的listener要开启).

  2. day 4 继承

    1.继承引入,减少代码量 1)版本1: class Animal: '''定义一个动物类''' def eat(self): print("----吃----") def drin ...

  3. pycharm设置github

    1.打开file,选择settings,找到Version Contorl,打开找到GitHub ,HOST填github.com,用户名,密码,test,稍等一会,会提示成功 2. 设置好以后 打开 ...

  4. Mac 安装PHP Redis 扩展

    其实 Mac 安装 Redis 还是很简单,以下为个人搭建配置.注意:文章中的“*”代表任意版本号 安装 Redis 服务 安装 brew install redis 使用 # 启动 redis-se ...

  5. 【MySQL安装】MySQL5.6在centos6.4上的安装

    卸载原来安装的mysql 安装从官网下载的mysql rpm包 发现有依赖,需要先安装libaio包和libnuma包 再装mysql就可以了 安装客户端 安装完成后,启动mysql 但是发现用没有m ...

  6. java 通过内存映射文件来提高IO读取文件性能

    MappedByteBuffer out = new RandomAccessFile("src/demo20/test.dat", "rw"). getCha ...

  7. sendcloud golang 发送短信 示例代码

    package main import ( "fmt" "crypto/md5" "encoding/hex" "sort&quo ...

  8. 【Python入门学习】闭包&装饰器&开放封闭原则

    1. 介绍闭包 闭包:如果在一个内部函数里,对在外部作用域的变量(不是全局作用域)进行引用,那边内部函数被称为闭包(closure) 例如:如果在一个内部函数里:func2()就是内部函数, 对在外部 ...

  9. 软件工程第七周psp

    1.PSP表格 类别 任务 开始时间 结束时间 中断时间 delta时间 立会 汇报昨天的成绩,分配任务,部署计划 10月27日18:00 10月27日18:36 0 36分钟 准备工作 查阅有关资料 ...

  10. winform界面之固定大小随dpi

    场景: 已经更改成大小可随dpi改变,可是在用applyresoures()之后(添加更改语言功能),发现控件大小失真. 分析:applyresoures()是把该控件的属性改为程序设计的固定大小,不 ...