【bzoj1532】[POI2005]Kos-Dicing 二分+网络流最大流
题目描述
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。
跑最大流,判断是否满流并调整边界,得到答案。
- #include <cstdio>
- #include <cstring>
- #include <queue>
- #define N 20010
- #define M 150010
- using namespace std;
- queue<int> q;
- int n , m , x[N] , y[N] , head[N] , to[M] , val[M] , next[M] , cnt , s , t , dis[N];
- void add(int x , int y , int z)
- {
- to[++cnt] = y , val[cnt] = z , next[cnt] = head[x] , head[x] = cnt;
- to[++cnt] = x , val[cnt] = 0 , next[cnt] = head[y] , head[y] = cnt;
- }
- bool bfs()
- {
- int x , i;
- memset(dis , 0 , sizeof(dis));
- while(!q.empty()) q.pop();
- dis[s] = 1 , q.push(s);
- while(!q.empty())
- {
- x = q.front() , q.pop();
- for(i = head[x] ; i ; i = next[i])
- {
- if(val[i] && !dis[to[i]])
- {
- dis[to[i]] = dis[x] + 1;
- if(to[i] == t) return 1;
- q.push(to[i]);
- }
- }
- }
- return 0;
- }
- int dinic(int x , int low)
- {
- if(x == t) return low;
- int temp = low , i , k;
- for(i = head[x] ; i ; i = next[i])
- {
- if(val[i] && dis[to[i]] == dis[x] + 1)
- {
- k = dinic(to[i] , min(temp , val[i]));
- if(!k) dis[to[i]] = 0;
- val[i] -= k , val[i ^ 1] += k;
- if(!(temp -= k)) break;
- }
- }
- return low - temp;
- }
- bool judge(int mid)
- {
- int i , sum = 0;
- memset(head , 0 , sizeof(head)) , cnt = 1;
- for(i = 1 ; i <= m ; i ++ ) add(s , i , 1) , add(i , x[i] + m , 1) , add(i , y[i] + m , 1);
- for(i = 1 ; i <= n ; i ++ ) add(i + m , t , mid);
- while(bfs()) sum += dinic(s , 1 << 30);
- return sum == m;
- }
- int main()
- {
- int i , l , r , mid , ans = 0;
- scanf("%d%d" , &n , &m) , s = 0 , t = m + n + 1;
- for(i = 1 ; i <= m ; i ++ ) scanf("%d%d" , &x[i] , &y[i]);
- l = 0 , r = m;
- while(l <= r)
- {
- mid = (l + r) >> 1;
- if(judge(mid)) ans = mid , r = mid - 1;
- else l = mid + 1;
- }
- printf("%d\n" , ans);
- return 0;
- }
【bzoj1532】[POI2005]Kos-Dicing 二分+网络流最大流的更多相关文章
- 【bzoj3130】[Sdoi2013]费用流 二分+网络流最大流
题目描述 Alice和Bob做游戏,给出一张有向图表示运输网络,Alice先给Bob一种最大流方案,然后Bob在所有边上分配总和等于P的非负费用.Alice希望总费用尽量小,而Bob希望总费用尽量大. ...
- 【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流
题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线 ...
- 【bzoj1733】[Usaco2005 feb]Secret Milking Machine 神秘的挤奶机 二分+网络流最大流
题目描述 Farmer John is constructing a new milking machine and wishes to keep it secret as long as possi ...
- POJ 2455 Secret Milking Machine(搜索-二分,网络流-最大流)
Secret Milking Machine Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9658 Accepted: ...
- 【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 ...
- BZOJ_1532_[POI2005]Kos-Dicing_二分+网络流
BZOJ_1532_[POI2005]Kos-Dicing_二分+网络流 Description Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一 ...
- HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)
HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...
- bzoj 3130 [Sdoi2013]费用流(二分,最大流)
Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络 ...
- hihoCoder 1389 Sewage Treatment 【二分+网络流+优化】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)
#1389 : Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people coul ...
随机推荐
- IE6常见CSS解析Bug和hack
第一:图片间隙 a:div中的图片间隙: 描述:在div中插入图片时,图片会将div下方撑大3像素 hack1:将<div>和<img>写在一行 hack2:将<img& ...
- gcc&g++
原文章 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为.cpp的,两者都会认为是c++程序,注 ...
- https握手失败案例(一)
OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .read ...
- 使用Android-Debug-Database 在浏览器中查看App的数据库
使用参考:http://www.jianshu.com/p/89ccae3e590b源码地址:https://github.com/amitshekhariitbhu/Android-Debug-Da ...
- 在使用线程池时应特别注意对ThreadLocal的使用
使用ThreadLocal并且有线程池时要特别注意,ThreadLocal是以线程为key的,而线程池里面的线程是会被重新利用的,所以如果有使用线程池并且使用ThreadLocal来保存状态信息时要特 ...
- 生鲜o2o配送应用系统,包括Android源码+SSH带后台管理系统
前台功能划分 我的 登录 账户+密码 注册 订单管理 查看/删除(显示订单详情) 支付(提交订单) ...
- UVA 427 The Tower of Babylon 巴比伦塔(dp)
据说是DAG的dp,可用spfa来做,松弛操作改成变长.注意状态的表示. 影响决策的只有顶部的尺寸,因为尺寸可能很大,所以用立方体的编号和高的编号来表示,然后向尺寸更小的转移就行了. #include ...
- 动态规划初步--最长上升子序列(LIS)
一.问题 有一个长为n的数列 a0,a1,a2...,an-1a.请求出这个序列中最长的上升子序列的长度和对应的子序列.上升子序列指的是对任意的i < j都满足ai < aj的子序列. 二 ...
- vue 实现走马灯效果
Part.1 问题 在写一个H5页面时遇到一个需求,头部公告需要滚动变换,需要实现一个走马灯效果 Part.2 实现 我的做法:利用 定时器 + CSS3 变换公告数组的顺序 从而实现走马灯效果 ...
- 参考别人的代码写的aes加密,记录一下(AES,ECB模式,填充PKCS5Padding,数据块128位,偏移量无,以hex16进制输出)
package org.jimmy.autosearch2019.test; import java.security.SecureRandom; import javax.crypto.Cipher ...