晚上果然不适合调题目

Description

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

Input

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

Output

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

题目分析

因为一场比赛只有两个人,且必定会分出输赢,那么将人与比赛之间连一条容量为1的边;比赛与汇点之间连一条容量为1的边。再二分源点连向每一个人的容量mid,代表每一个人的最大获胜场数。每一次的check就是检查最大流是否达到m。

不知道为什么这题当前弧优化这么明显……以后写dinic还是三个优化都加好了。

  1. #include<queue>
  2. #include<cctype>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. const int maxn = ;
  7. const int maxm = ;
  8. const int INF = 2e9;
  9.  
  10. struct Edge
  11. {
  12. int u,v,f,c;
  13. Edge(int a=, int b=, int c=, int d=):u(a),v(b),f(c),c(d) {}
  14. }edges[maxm];
  15. int n,m,S,T,L,R,ans;
  16. int edgeTot,head[maxn],cur[maxn],nxt[maxm],lv[maxn];
  17.  
  18. int read()
  19. {
  20. char ch = getchar();
  21. int num = , fl = ;
  22. for (; !isdigit(ch); ch=getchar())
  23. if (ch=='-') fl = -;
  24. for (; isdigit(ch); ch=getchar())
  25. num = (num<<)+(num<<)+ch-;
  26. return num*fl;
  27. }
  28. bool buildLevel()
  29. {
  30. memset(lv, , sizeof lv);
  31. std::queue<int> q;
  32. q.push(S), lv[S] = ;
  33. for (int i=; i<=n+m+; i++) cur[i] = head[i];
  34. for (int tmp; q.size(); )
  35. {
  36. tmp = q.front(), q.pop();
  37. for (int i=head[tmp]; i!=-; i=nxt[i])
  38. {
  39. int v = edges[i].v;
  40. if (!lv[v]&&edges[i].f < edges[i].c){
  41. lv[v] = lv[tmp]+, q.push(v);
  42. if (v==T) return true;
  43. }
  44. }
  45. }
  46. return false;
  47. }
  48. int fndPath(int x, int lim)
  49. {
  50. if (x==T) return lim;
  51. for (int &i=cur[x]; i!=-; i=nxt[i])
  52. {
  53. int v = edges[i].v, val;
  54. if (lv[x]+==lv[v]&&edges[i].f < edges[i].c){
  55. if ((val = fndPath(v, std::min(lim, edges[i].c-edges[i].f)))){
  56. edges[i].f += val, edges[i^].f -= val;
  57. return val;
  58. }else lv[v] = -;
  59. }
  60. }
  61. cur[x] = head[x];
  62. return ;
  63. }
  64. int dinic()
  65. {
  66. int ret = , val;
  67. while (buildLevel())
  68. while ((val = fndPath(S, INF))) ret += val;
  69. return ret;
  70. }
  71. void addedge(int u, int v, int c)
  72. {
  73. edges[edgeTot] = Edge(u, v, , c), nxt[edgeTot] = head[u], head[u] = edgeTot++;
  74. edges[edgeTot] = Edge(v, u, , ), nxt[edgeTot] = head[v], head[v] = edgeTot++;
  75. }
  76. int main()
  77. {
  78. memset(head, -, sizeof head);
  79. n = read(), m = read();
  80. S = , T = n+m+;
  81. for (int i=; i<=n; i++) addedge(S, i, m);
  82. for (int i=; i<=m; i++)
  83. {
  84. addedge(read(), n+i, );
  85. addedge(read(), n+i, );
  86. addedge(n+i, T, );
  87. }
  88. L = , R = m;
  89. for (int mid=(L+R)>>; L<=R; mid=(L+R)>>)
  90. {
  91. for (int i=; i<n*; i+=)
  92. edges[i].c = mid, edges[i].f = ,
  93. edges[i^].c = edges[i^].f = ;
  94. for (int i=n*; i<edgeTot; i++)
  95. edges[i].f = ;
  96. if (dinic() >= m) ans = mid, R = mid-;
  97. else L = mid+;
  98. }
  99. printf("%d\n",ans);
  100. return ;
  101. }

END

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

  1. uvalive 3231 Fair Share 公平分配问题 二分+最大流 右边最多流量的结点流量尽量少。

    /** 题目: uvalive 3231 Fair Share 公平分配问题 链接:https://vjudge.net/problem/UVALive-3231 题意:有m个任务,n个处理器,每个任 ...

  2. poj 2391 Ombrophobic Bovines 最短路 二分 最大流 拆点

    题目链接 题意 有\(n\)个牛棚,每个牛棚初始有\(a_i\)头牛,最后能容纳\(b_i\)头牛.有\(m\)条道路,边权为走这段路所需花费的时间.问最少需要多少时间能让所有的牛都有牛棚可待? 思路 ...

  3. HDU3081 Marriage Match II —— 传递闭包 + 二分图最大匹配 or 传递闭包 + 二分 + 最大流

    题目链接:https://vjudge.net/problem/HDU-3081 Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    ...

  4. HDU-3081-Marriage Match II 二分图匹配+并查集 OR 二分+最大流

    二分+最大流: 1 //题目大意:有编号为1~n的女生和1~n的男生配对 2 // 3 //首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 4 // 5 //然后输入f组,c,d表示 ...

  5. hdu4560 不错的建图,二分最大流

    题意: 我是歌手 Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...

  6. POJ3228二分最大流

    题意:       有n个点,每个点有两个权值,金子数量还有仓库容量,金子可以存在自己的仓库里或者是别的仓库里,仓库和仓库之间有距离,问所有金子都必须存到库里最大距离的最小是多少? 思路:       ...

  7. BZOJ 1532 [POI2005]Kos-Dicing(二分+最大流判断)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1532 [题目大意] n个人,给出m场比赛,求出胜出的人最少赢的场次. [题解] 我们发 ...

  8. BZOJ1532: [POI2005]Kos-Dicing

    1532: [POI2005]Kos-Dicing Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1060  Solved: 321[Submit][St ...

  9. BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流

    1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...

随机推荐

  1. jquery jtemplates.js模板渲染引擎的详细用法第一篇

    jquery jtemplates.js模板渲染引擎的详细用法第一篇 Author:ching Date:2016-06-29 jTemplates是一个基于JQuery的模板引擎插件,功能强大,有了 ...

  2. PostgreSQL - invalid input syntax for type timestamp with time zone

    问题 在执行以下sql时报错: select COALESCE(null,null,now(),''); 报错如下: SQL Error [22007]: ERROR: invalid input s ...

  3. CSS样式之操作属性一

    ********css之操作属性******** 一.文本 1.文本颜色:color 颜色属性被用来设置文字的颜色 颜色是通过CSS最经常的指定: 十六进制值 - 如: #FF0000 一个RGB值 ...

  4. phpcms9.6 注入分析

    phpcms9.6 注入分析 漏洞促发点\phpcms\modules\content\down.php $a_k = trim($_GET['a_k']); if(!isset($a_k)) sho ...

  5. Linux —— GDB调试程序

    调试实现 在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件. 生成可执行文件命令: g+ ...

  6. mybatis pageHelper 分页插件使用

    转载大神 https://blog.csdn.net/qq_33624284/article/details/72828977 把插件jar包导入项目(具体上篇有介绍http://blog.csdn. ...

  7. Cube配置http通过SSRS连接

    IIS的配置:http://www.cnblogs.com/ycdx2001/p/4254994.html 连接字符串: Data Source=http://IP74/olap/msmdpump.d ...

  8. DialogHelper

    //require ScrollHelper.js function DialogHelper() { var _this = this; var doc = window.document; _th ...

  9. watir 的api在线文档

    http://rubydoc.info/gems/watir-webdriver/frames http://rdoc.info/gems/watir-webdriver/frames http:// ...

  10. cpu 满载测试软件

    for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/d ...