题目描述

Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一个俱乐部. 俱乐部的人时常在一起玩这个游戏然后评选出玩得最好的人.现在有一个非常不走运的家伙,他想成为那个玩的最好的人,他现在知道了所有比赛的安排,他想知道,在最好的情况下,他最少只需要赢几场就可以赢得冠军,即他想知道比赛以后赢的最多的那个家伙最少会赢多少场.

输入

第一行两个整数n 和 m, 1 <= n <= 10 000, 0 <= m <= 10 000; n 表示一共有多少个参赛者, m 表示有多少场比赛. 选手从1 到 n编号. 接下来m 行每行两个整数表示该场比赛的两个选手,两个选手可能比赛多场.

输出

第一行表示赢得最多的人最少会赢多少场

样例输入

4 4
1 2
1 3
1 4
1 2

样例输出

1


题解

二分+网络流最大流

显然答案是可以二分的,所以我们可以二分mid,问题就转变为:每个人最多赢mid场,问能否完成所有比赛。

连边S->每场比赛,容量为1;每场比赛->对应的两个参赛的人,容量为1;每个人->T,容量为mid。

跑最大流,判断是否满流并调整边界,得到答案。

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

【bzoj1532】[POI2005]Kos-Dicing 二分+网络流最大流的更多相关文章

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

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

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

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

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

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

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

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

  5. 【bzoj1738】[Usaco2005 mar]Ombrophobic Bovines 发抖的牛 Floyd+二分+网络流最大流

    题目描述 FJ's cows really hate getting wet so much that the mere thought of getting caught in the rain m ...

  6. BZOJ_1532_[POI2005]Kos-Dicing_二分+网络流

    BZOJ_1532_[POI2005]Kos-Dicing_二分+网络流 Description Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一 ...

  7. HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)

    HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...

  8. bzoj 3130 [Sdoi2013]费用流(二分,最大流)

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

  9. hihoCoder 1389 Sewage Treatment 【二分+网络流+优化】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)

    #1389 : Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people coul ...

随机推荐

  1. 简洁js日历控件的使用

    往Web工程添加纯js日历控件 在网上找到了DatePicker.js(http://www.cnblogs.com/shenyixin/archive/2013/03/11/2954156.html ...

  2. Yii2中多表关联查询(with、join、joinwith)

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order         (id  order_name   custome ...

  3. [jQuery] Cannot read property ‘msie’ of undefined错误的解决方法 --转

    初用Yii的srbac模块.出现 Cannot read property ‘msie’ of undefined 错误.上网查询,找到如下的文章.使用文末的打补丁的方法,成功搞定.感谢. ===== ...

  4. 将从SQL2008 r2里备份的数据库还原到SQL2008中

    从标题可以看出这是未解决上一篇遗留问题写的,现在我也不知道这个可不可以成功,方法似乎查到了一种,具体怎样还不清楚:而且,我想说的是“我踩雷了”. 这篇的主角是“Database Publishing ...

  5. 如何让Sublime Text编辑器支持新的ABAP关键字

    ABAP 7.40推出了许多新的关键字 - keyword,您的Sublime Text可能无法针对这些新关键字实现期望的语法高亮显示(syntax highlight)或者自动完成(auto com ...

  6. Android(java)学习笔记145:Handler消息机制的原理和实现

     联合学习 Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系   1. 首先我们通过一个实例案例来引出一个异常: (1)布局文件activity_m ...

  7. MINST手写数字识别(三)—— 使用antirectifier替换ReLU激活函数

    这是一个来自官网的示例:https://github.com/keras-team/keras/blob/master/examples/antirectifier.py 与之前的MINST手写数字识 ...

  8. WPF知识点全攻略10- 路由事件

    路由事件是WPF不得不提,不得不会系列又一 先来看一下他的定义: 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件. 实现定义:路由事件是一个 C ...

  9. NYOJ-06-喷水装置(一)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=6 喷水装置(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现有 ...

  10. Python基础篇 -- 字符串

    字符串 字符串是不可变的对象,任何操作对原字符串是不会有任何影响的. 索引和切片 索引 . 索引就是下标, 下标从 0 开始, 使用[] 来获取数据 s1 = "0123456" ...