题目描述

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. IE6常见CSS解析Bug和hack

    第一:图片间隙 a:div中的图片间隙: 描述:在div中插入图片时,图片会将div下方撑大3像素 hack1:将<div>和<img>写在一行 hack2:将<img& ...

  2. gcc&g++

    原文章 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为.cpp的,两者都会认为是c++程序,注 ...

  3. https握手失败案例(一)

      OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .read ...

  4. 使用Android-Debug-Database 在浏览器中查看App的数据库

    使用参考:http://www.jianshu.com/p/89ccae3e590b源码地址:https://github.com/amitshekhariitbhu/Android-Debug-Da ...

  5. 在使用线程池时应特别注意对ThreadLocal的使用

    使用ThreadLocal并且有线程池时要特别注意,ThreadLocal是以线程为key的,而线程池里面的线程是会被重新利用的,所以如果有使用线程池并且使用ThreadLocal来保存状态信息时要特 ...

  6. 生鲜o2o配送应用系统,包括Android源码+SSH带后台管理系统

    前台功能划分    我的 登录            账户+密码 注册            订单管理 查看/删除(显示订单详情)                支付(提交订单)           ...

  7. UVA 427 The Tower of Babylon 巴比伦塔(dp)

    据说是DAG的dp,可用spfa来做,松弛操作改成变长.注意状态的表示. 影响决策的只有顶部的尺寸,因为尺寸可能很大,所以用立方体的编号和高的编号来表示,然后向尺寸更小的转移就行了. #include ...

  8. 动态规划初步--最长上升子序列(LIS)

    一.问题 有一个长为n的数列 a0,a1,a2...,an-1a.请求出这个序列中最长的上升子序列的长度和对应的子序列.上升子序列指的是对任意的i < j都满足ai < aj的子序列. 二 ...

  9. vue 实现走马灯效果

    Part.1  问题 在写一个H5页面时遇到一个需求,头部公告需要滚动变换,需要实现一个走马灯效果 Part.2  实现 我的做法:利用 定时器 + CSS3 变换公告数组的顺序 从而实现走马灯效果 ...

  10. 参考别人的代码写的aes加密,记录一下(AES,ECB模式,填充PKCS5Padding,数据块128位,偏移量无,以hex16进制输出)

    package org.jimmy.autosearch2019.test; import java.security.SecureRandom; import javax.crypto.Cipher ...