BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流
1305: [CQOI2009]dance跳舞
Description
一次舞会有n个男孩和n个女孩。每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞。每个男孩都不会和同一个女孩跳两首(或更多)舞曲。有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”)。每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞。给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲?
Input
第一行包含两个整数n和k。以下n行每行包含n个字符,其中第i行第j个字符为'Y'当且仅当男孩i和女孩j相互喜欢。
Output
仅一个数,即舞曲数目的最大值。
Sample Input
YYY
YYY
YYY
Sample Output
HINT
题解:
建图:
男女分别拆点x,y
男生拆点后 有x1,x2两种,女生拆点后又y1,y2
S - x1( 连向喜欢的人的点 )-> y1 ->T
容量k | |
x2(连向不喜欢的人的点)->y2
其余容量为1
二分答案,从S流出的每条边容量为mid,check 是否满流
#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define ls i<<1
#define rs ls | 1
#define mid ((ll+rr)>>1)
#define pii pair<int,int>
#define MP make_pair
typedef long long LL;
const long long INF = 1e18+1LL;
const double Pi = acos(-1.0);
const int N = , M = 1e3+, mod = 1e9+, inf = 2e9;
char mp[][];
int n,k,head[N],t=,h[N],q[N],S,T,ans;
struct edge{int to,next,v;}e[N * ];
void adds(int u,int v,int w) {e[t].to=v;e[t].v=w;e[t].next=head[u];head[u]=t++;}
void add(int u,int v,int w) {adds(u,v,w);adds(v,u,);}
int bfs() {
memset(h,-,sizeof(h));
int l=,r=,now;
q[l]=S;
h[S]=;
while(l!=r){
now=q[l++];if(l == ) l=;
for(int i=head[now];i!=-;i=e[i].next) {
if(e[i].v&&h[e[i].to]==-) {
h[e[i].to]=h[now]+;
q[r++]=e[i].to;
if(r==) r = ;
}
}
}
if(h[T]==-) return ;
else return ;
}
int dfs(int x,int f) {
if(x == T) return f;
int used=,w;
for(int i=head[x]; i!=-;i=e[i].next) {
if(e[i].v&&h[e[i].to] == h[x] + ) {
w=dfs(e[i].to,min(f-used,e[i].v));
used+=w;e[i].v-=w;e[i^].v+=w;
if(used == f) return f;
}
}
return used;
}
void dinic() {while(bfs()) ans+=dfs(S,inf);} int check(int x) {
t = ;S = *n+, T = S+;
memset(head,-,sizeof(head));
for(int i=;i<=n;++i) {
add(S,i,x);
add(i,i+n,k);
add(*n+i+n,i+*n,k);
add(*n+i,T,x);
}
for(int i=;i<=n;++i) {
for(int j=;j<=n;++j) {
if(mp[i][j] == 'Y') {
add(i,*n+j,);
}
else add(i+n,*n+n+j,);
}
}ans = ;
dinic();
if(ans == n*x) return ;
else return ;
}
int main() {
scanf("%d%d",&n,&k);
for(int i=;i<=n;++i) scanf("%s",mp[i]+);
int l = , r = n,ans1;
while(l <= r) {
int md = (l+r)>>;
if(check(md)) {
ans1 = md;l = md+;
} else r = md-;
}
printf("%d\n",ans1);
return ;
}
BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流的更多相关文章
- BZOJ 1305 CQOI2009 dance跳舞 二分答案+最大流
题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连 ...
- BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- bzoj 1305: [CQOI2009]dance跳舞
题目链接 bzoj 1305: [CQOI2009]dance跳舞 题解 男,女生拆点A1A2,B1B2,拆成两点间分别连容量为K的边,限制与不喜欢的人跳舞的数量 A1连接源点容量为x,B1连接汇点容 ...
- BZOJ 1305: [CQOI2009]dance跳舞( 最大流 )
云神代码很短...0 ms过的...看了代码 , 大概是贪心... orz 我不会证 数据这么小乱搞就可以了吧... ←_← 这道题网络流还是可以写的... 既然限制了最多只能和 k 个不喜欢的人da ...
- BZOJ 1305 [CQOI2009]dance跳舞(二分+网络流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1305 [题目大意] 一次舞会有n个男孩和n个女孩. 每首曲子开始时,所有男孩和女孩恰好 ...
- bzoj 1305: [CQOI2009]dance 二分+網絡流判定
1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 1340 Solved: 581[Submit][Sta ...
- [CQOI2009]dance跳舞(最大流+二分)
[CQOI2009]dance跳舞 每个人拆成$2$个点,表示是否与喜欢的人跳舞 跳$m$首舞曲时,满足最大流为$n*m$ 二分$m$,跑最大流即可 #include<cstdio> #i ...
- BZOJ 1305 dance跳舞 二分+最大流
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1305 题目大意: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成 ...
- BZOJ 1305:dance跳舞(二分+最大流)
一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”).每个男孩 ...
随机推荐
- Service Provider Interface
@(Java)[SPI] Service Provider Interface API的一种设计方法,一般用于一些服务提供给第三方实现或者扩展,可以增强框架的扩展或者替换一些组件. 结构 Servic ...
- python 反射
python 反射的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! 反射的四个基本函数使用 hasattr,getattr,setatt ...
- 向maven中央仓库提交jar
从来都是从中央仓库下载jar,这次需要向中央仓库提交jar, 利用Sonatype OSSRH可以把jar等资源提交给Maven的中央仓库. Sonatype OSSRH介绍: Sonatype OS ...
- socket (一)
socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...
- ubuntu16.04(beaglebone) 下vim 和gcc 的信息
root@arm:~# dpkg -L gcc /. /usr /usr/bin /usr/bin/c99-gcc /usr/bin/c89-gcc /usr/share /usr/share/doc ...
- JS事件的三种方式
1.直接在元素上绑定回调函数 <button id="btn" onclick="clickBtn()">click me</button&g ...
- c++文件输入输出流fstream,对输入>>和输出<<重载
1. fstream 继承自iostream --> 要包含头文件#include<fstream> 2. 建立文件流对象 3. 打开文件夹 4. 测试是否打开成功 5. 进行读写操 ...
- 基于Spring AOP的JDK动态代理和CGLIB代理
一.AOP的概念 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...
- css中margin的应用
1.margin用于设置外边距,没有继承性,父元素设置的margin属性子元素不会继承. 2.margin存在重叠的问题. 水平边距永远不会发生重叠. 垂直边距在特定情况下会重叠. 重叠问题都很容易解 ...
- Python全栈【异常处理】
Python全栈[异常处理] 本节内容: 1.异常处理 2.什么时候用异常处理 异常处理 1.异常处理: 异常就是程序运行时发生错误的信号,异常处理是在编程过程中为了增加友好性,在程序出现bug时一般 ...