【二分 最大流】bzoj1532: [POI2005]Kos-Dicing
晚上果然不适合调题目
Description
Input
Output
题目分析
因为一场比赛只有两个人,且必定会分出输赢,那么将人与比赛之间连一条容量为1的边;比赛与汇点之间连一条容量为1的边。再二分源点连向每一个人的容量mid,代表每一个人的最大获胜场数。每一次的check就是检查最大流是否达到m。
不知道为什么这题当前弧优化这么明显……以后写dinic还是三个优化都加好了。
- #include<queue>
- #include<cctype>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- const int maxn = ;
- const int maxm = ;
- const int INF = 2e9;
- struct Edge
- {
- int u,v,f,c;
- Edge(int a=, int b=, int c=, int d=):u(a),v(b),f(c),c(d) {}
- }edges[maxm];
- int n,m,S,T,L,R,ans;
- int edgeTot,head[maxn],cur[maxn],nxt[maxm],lv[maxn];
- int read()
- {
- char ch = getchar();
- int num = , fl = ;
- for (; !isdigit(ch); ch=getchar())
- if (ch=='-') fl = -;
- for (; isdigit(ch); ch=getchar())
- num = (num<<)+(num<<)+ch-;
- return num*fl;
- }
- bool buildLevel()
- {
- memset(lv, , sizeof lv);
- std::queue<int> q;
- q.push(S), lv[S] = ;
- for (int i=; i<=n+m+; i++) cur[i] = head[i];
- for (int tmp; q.size(); )
- {
- tmp = q.front(), q.pop();
- for (int i=head[tmp]; i!=-; i=nxt[i])
- {
- int v = edges[i].v;
- if (!lv[v]&&edges[i].f < edges[i].c){
- lv[v] = lv[tmp]+, q.push(v);
- if (v==T) return true;
- }
- }
- }
- return false;
- }
- int fndPath(int x, int lim)
- {
- if (x==T) return lim;
- for (int &i=cur[x]; i!=-; i=nxt[i])
- {
- int v = edges[i].v, val;
- if (lv[x]+==lv[v]&&edges[i].f < edges[i].c){
- if ((val = fndPath(v, std::min(lim, edges[i].c-edges[i].f)))){
- edges[i].f += val, edges[i^].f -= val;
- return val;
- }else lv[v] = -;
- }
- }
- cur[x] = head[x];
- return ;
- }
- int dinic()
- {
- int ret = , val;
- while (buildLevel())
- while ((val = fndPath(S, INF))) ret += val;
- return ret;
- }
- void addedge(int u, int v, int c)
- {
- edges[edgeTot] = Edge(u, v, , c), nxt[edgeTot] = head[u], head[u] = edgeTot++;
- edges[edgeTot] = Edge(v, u, , ), nxt[edgeTot] = head[v], head[v] = edgeTot++;
- }
- int main()
- {
- memset(head, -, sizeof head);
- n = read(), m = read();
- S = , T = n+m+;
- for (int i=; i<=n; i++) addedge(S, i, m);
- for (int i=; i<=m; i++)
- {
- addedge(read(), n+i, );
- addedge(read(), n+i, );
- addedge(n+i, T, );
- }
- L = , R = m;
- for (int mid=(L+R)>>; L<=R; mid=(L+R)>>)
- {
- for (int i=; i<n*; i+=)
- edges[i].c = mid, edges[i].f = ,
- edges[i^].c = edges[i^].f = ;
- for (int i=n*; i<edgeTot; i++)
- edges[i].f = ;
- if (dinic() >= m) ans = mid, R = mid-;
- else L = mid+;
- }
- printf("%d\n",ans);
- return ;
- }
END
【二分 最大流】bzoj1532: [POI2005]Kos-Dicing的更多相关文章
- uvalive 3231 Fair Share 公平分配问题 二分+最大流 右边最多流量的结点流量尽量少。
/** 题目: uvalive 3231 Fair Share 公平分配问题 链接:https://vjudge.net/problem/UVALive-3231 题意:有m个任务,n个处理器,每个任 ...
- poj 2391 Ombrophobic Bovines 最短路 二分 最大流 拆点
题目链接 题意 有\(n\)个牛棚,每个牛棚初始有\(a_i\)头牛,最后能容纳\(b_i\)头牛.有\(m\)条道路,边权为走这段路所需花费的时间.问最少需要多少时间能让所有的牛都有牛棚可待? 思路 ...
- HDU3081 Marriage Match II —— 传递闭包 + 二分图最大匹配 or 传递闭包 + 二分 + 最大流
题目链接:https://vjudge.net/problem/HDU-3081 Marriage Match II Time Limit: 2000/1000 MS (Java/Others) ...
- HDU-3081-Marriage Match II 二分图匹配+并查集 OR 二分+最大流
二分+最大流: 1 //题目大意:有编号为1~n的女生和1~n的男生配对 2 // 3 //首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 4 // 5 //然后输入f组,c,d表示 ...
- hdu4560 不错的建图,二分最大流
题意: 我是歌手 Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...
- POJ3228二分最大流
题意: 有n个点,每个点有两个权值,金子数量还有仓库容量,金子可以存在自己的仓库里或者是别的仓库里,仓库和仓库之间有距离,问所有金子都必须存到库里最大距离的最小是多少? 思路: ...
- BZOJ 1532 [POI2005]Kos-Dicing(二分+最大流判断)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1532 [题目大意] n个人,给出m场比赛,求出胜出的人最少赢的场次. [题解] 我们发 ...
- BZOJ1532: [POI2005]Kos-Dicing
1532: [POI2005]Kos-Dicing Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1060 Solved: 321[Submit][St ...
- BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流
1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...
随机推荐
- Count the string (KMP+DP)
题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { , ...
- std::less
std::less 定义于头文件 <functional> template< class T >struct less; (C++14 前) template ...
- p标签间距问题
用<p></p>标签写文本时,控制行与行之间的高度最好用line-height,不要用margin或padding: 因为P标签本身就带有一定的上下间距,且自带的间距在模拟 ...
- vue -- key的特殊作用
v-for渲染的列表的结构采用“就地复用”的策略,也就说当数据重新排列数据时,会复用已在页面渲染好的元素,不会移动 DOM 元素来匹配数据项的顺序,这种模式是高效的,改变现有位置的结构的数据即可 eg ...
- ES6入门教程---变量和常量
ES6提出了两个新的声明变量的命令:let 和 const 1. 建议不再使用var,而使用let 和const .优先使用const. 在定义之后值是固定不变的,即为常量 常量的值不能修改,但是如果 ...
- mysql5.7安装部署后初始密码查看以及修改
一.查看初始密码以下两种方法: 1.找到自己的error.log日志文件,执行自己的命令,红色标记的部分为初始化密码. grep 'temporary password' /data/mysql/er ...
- 牛客网36-A,B题解
A.Rabbit的字符串 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 Rabbit得到了一 ...
- 1121 - Reverse the lights 思维题
http://www.ifrog.cc/acm/problem/1121 我看到这些翻转的题就怕,可能要练下这些专题. 我最怕这类题了. 一开始想了下dp, dp[i][0 / 1]表示完成了前i位, ...
- 《java学习三》jvm性能优化-------调优
常见参数配置 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收 -XX:+PrintGCDetails 更详细的GC日志 -X ...
- C#实现程序单例日志输出
对于一个完整的程序系统,一个日志记录是必不可少的.可以用它来记录程序在运行过程中的运行状态和报错信息.比如,那些不想通过弹框提示的错误,程序执行过程中捕获的异常等. 首先,在你的解决方案中,适当的目录 ...