[BZOJ1305][CQOI2009]跳舞(网络流)
1305: [CQOI2009]dance跳舞
Time Limit: 5 Sec Memory Limit: 162 MB
Submit: 3944 Solved: 1692
[Submit][Status][Discuss]Description
一
次舞会有n个男孩和n个女孩。每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞。每个男孩都不会和同一个女孩跳两首(或更多)舞曲。有一些男孩女孩相
互喜欢,而其他相互不喜欢(不会“单向喜欢”)。每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞。给出每对男
孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲?Input
第一行包含两个整数n和k。以下n行每行包含n个字符,其中第i行第j个字符为'Y'当且仅当男孩i和女孩j相互喜欢。
Output
仅一个数,即舞曲数目的最大值。
Sample Input
3 0
YYY
YYY
YYYSample Output
3HINT
N<=50 K<=30
Source
显然是一个二分图匹配的问题,将每个人拆成两个点:喜欢点i和讨厌点i',每个限制依次考虑:
1.一对只跳一次:喜欢则i和j连1的边,讨厌则i'和j'连1的边。
2.讨厌至多k个:i向i'连k的边,j'向j连k的边。
3.但是这样直接跑之后并不能得到结果,因为不保证同性之间没有冲突,所以必须二分答案mid,S向i连mid边,j向T连mid边。
跑$O(\log n)$次最大流即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
using namespace std; const int N=,M=,inf=0x3f3f3f3f;
char ch;
int n,k,cnt,ans,mx,mid,S,T,d[N],q[M],h[N],f[M],nxt[M],to[M],mp[N][N]; void add(int u,int v,int w){
to[++cnt]=v; f[cnt]=w; nxt[cnt]=h[u]; h[u]=cnt;
to[++cnt]=u; f[cnt]=; nxt[cnt]=h[v]; h[v]=cnt;
} int bfs(){
rep(i,,T) d[i]=; d[S]=; q[]=S;
for (int st=,ed=; st!=ed; ){
int x=q[++st];
For(i,x) if (!d[k=to[i]] && f[i]) q[++ed]=k,d[k]=d[x]+;
}
return d[T];
} int dfs(int x,int lim){
if (x==T) return lim;
int c=,t;
For(i,x) if (d[k=to[i]]==d[x]+ && f[i]){
t=dfs(k,min(lim-c,f[i]));
f[i]-=t; f[i^]+=t; c+=t;
if (c==lim) return lim;
}
if (!c) d[x]=-;
return c;
} void build(){
cnt=; memset(h,,sizeof(h));
S=*n+,T=*n+;
rep(i,,n) add(S,i,mid),add(i,i+n,k),add(i+*n,i+*n,k),add(i+*n,T,mid);
rep(i,,n) rep(j,,n) if (mp[i][j]) add(i,j+*n,); else add(i+n,j+*n,);
} int main(){
freopen("bzoj1305.in","r",stdin);
freopen("bzoj1305.out","w",stdout);
scanf("%d%d",&n,&k);
rep(i,,n) rep(j,,n) scanf(" %c",&ch),mp[i][j]=(ch=='Y');
int L=,R=n;
while (L<=R){
mid=(L+R)>>; build();
ans=; while (bfs()) ans+=dfs(S,inf);
if (ans>=n*mid) mx=mid,L=mid+; else R=mid-;
}
printf("%d\n",mx);
return ;
}
[BZOJ1305][CQOI2009]跳舞(网络流)的更多相关文章
- [CQOI2009]跳舞 网络流
题面:[CQOI2009]跳舞 题解: 首先最大时间不好求,而且数据范围很小,所以我们可以先二分一个最大时间,然后就只需要判断是否可行即可. 因此我们每二分一个mid,对于每个女生,连s ---> ...
- 【BZOJ1305】跳舞(网络流)
[BZOJ1305]跳舞(网络流) 题面 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一 ...
- 题解 P3153 【[CQOI2009]跳舞】
P3153 [CQOI2009]跳舞 题目描述 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢 ...
- BZOJ1305 [CQOI2009]dance跳舞 【网络流】
1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 3714 Solved: 1572 [Submit][ ...
- bzoj1305: [CQOI2009]dance跳舞(二分答案+网络流)
1305: [CQOI2009]dance跳舞 题目:传送门 题解: 一眼网络流基础建模...然后就GG了 二分答案+拆点建边+最大流判断: 把男女生拆为男1,男2,女1,女2 1.男1和男2还有女1 ...
- Bzoj1305 [CQOI2009]dance跳舞
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 2925 Solved: 1221 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时 ...
- bzoj千题计划130:bzoj1305: [CQOI2009]dance跳舞
http://www.lydsy.com/JudgeOnline/problem.php?id=1305 每个人拆为喜欢(yes)和不喜欢(no)两个点 二分答案 1.每两个人之间只能跳一次 喜欢则 ...
- 并不对劲的bzoj1305: [CQOI2009]dance跳舞
传送门-> 又是陈年老坑. 听上去不知道从何下[手]?那要是把题目换成“判断这些人能否条x支舞”呢? 这样就变成了一个网络流可以解决的问题,只要把每个人拆成喜欢和不喜欢两点,每个人两点总流量不超 ...
- 【二分答案】【最大流】bzoj1305 [CQOI2009]dance跳舞
http://hzwer.com/1986.html #include<cstdio> #include<algorithm> #include<queue> #i ...
随机推荐
- 基本控件文档-UISlider属性---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/C ...
- 五分钟学习Java8的流编程
1.概述 Java8中在Collection中增加了一个stream()方法,该方法返回一个Stream类型.我们就是用该Stream来进行流编程的: 流与集合不同,流是只有在按需计算的,而集合是已经 ...
- Angular2.0 基础: User Input
1.Angular 2.0 中的变量 对输入值的获取,我们可以通过$event 来获取,也可以通过变量来获取. template: ` <input (keyup)="onKey($e ...
- vim 实现括号以及引号的自动补全
编辑文件/etc/vim/vimrc sudo vim /etc/vim/vimrc 在最后添加 inoremap ( ()<ESC>i inoremap [ []<ESC>i ...
- 如何用CMD开启3389与查看3389端口
开启 REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections / ...
- Yii 1.1.17 一、安装、目录结构、视图、控制器、扩展自定义函数
这几天了解了一下Yii框架,以简单的博客项目实战入门.大致的实现流程做个记录. 一.Yii 安装与环境检测 从 www.yiiframework.com 获取一份Yii的拷贝,解压到 /wwwroot ...
- 測試 battery capacity curve 的負載
昨天有同事問說, 他要測試 battery capacity curve, 並且負載要使用 33mA, 於是我想到有一個 apk 名稱為 快速放電 (最下方),可以控制 cpu 的 load, 他試了 ...
- java===java基础学习(9)---方法参数
方法参数注意三要点: 一个方法不能修改一个基本数据类型的参数(数值型或者布尔型). 一个方法可以改变一个对象参数的状态. 一个方法不能让对象参数引用一个新的对象. package testbotoo; ...
- x64dbg
https://x64dbg.com/ https://github.com/x64dbg/x64dbg https://sourceforge.net/projects/x64dbg/files/s ...
- 图论-强连通分量-Tarjan算法
有关概念: 如果图中两个结点可以相互通达,则称两个结点强连通. 如果有向图G的每两个结点都强连通,称G是一个强连通图. 有向图的极大强连通子图(没有被其他强连通子图包含),称为强连通分量.(这个定义在 ...