【BZOJ 1305】[CQOI2009]dance跳舞
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
男生和女生每个人都分身成两个节点
即x[1],x[2]和y[1],y[2]
然后如果i和j不相互喜欢
那么add(x[i][2],y[j][2],1)
如果相互喜欢的话
add(x[i][1],y[j][1],1)
然后对于每个男生
add(x[i][1],y[i][1],k)
对于每个女生
add(y[i][2],y[i][1],k)
然后对于每个男生
add(s,x[i][1],mid)
add(y[i][1],t,mid)
这里的mid是二分的值。
这个mid就是舞会的轮数了。
如果能够满流显然每个人都能配对跳mid支舞
显然是有单调性的。
(然后发现原来的dicnic的模板是错的。。边数的计算要特别careful.
【代码】
#include <bits/stdc++.h>
using namespace std;
const int N = 50;
struct abc{
int nex,en,flow;
}bian[2][N*N*2+8*N+10];
int n,k,x[N+10][3],y[N+10][3],fir[2][N*4+10],tfir[N*4+10],totm,deep[N*4+10];
int cnt = 0;
bool bo[N+10][N+10];
char s[N+10];
queue<int> dl;
//每个男人分为(x1,x2)
//每个女人分为(y1,y2)
void add(int x,int y,int cost,int i){
bian[i][totm].nex = fir[i][x];
fir[i][x] = totm;
bian[i][totm].en = y,bian[i][totm].flow = cost;
totm++;
bian[i][totm].nex = fir[i][y];
fir[i][y] = totm;
bian[i][totm].en = x,bian[i][totm].flow = 0;
totm++;
}
bool bfs(int s,int t){
dl.push(s);
memset(deep,255,sizeof deep);
deep[s] = 0;
while (!dl.empty()){
int x = dl.front();
dl.pop();
for (int temp = fir[1][x]; temp!= -1 ;temp = bian[1][temp].nex){
int y = bian[1][temp].en;
if (deep[y]==-1 && bian[1][temp].flow>0){
deep[y] = deep[x] + 1;
dl.push(y);
}
}
}
return deep[t]!=-1;
}
int dfs(int x,int t,int limit){
if (x == t) return limit;
if (limit == 0) return 0;
int cur,f = 0;
for (int temp = tfir[x];temp!=-1;temp = bian[1][temp].nex){
tfir[x] = temp;
int y = bian[1][temp].en;
if (deep[y] == deep[x] + 1 && (cur = dfs(y,t,min(limit,bian[1][temp].flow))) ){
f += cur;
limit -= cur;
bian[1][temp].flow -= cur;
bian[1][temp^1].flow += cur;
if (!limit) break;
}
}
return f;
}
int get_flow(){
int now = 0;
while (bfs(0,cnt)){
for (int i = 0;i <= cnt;i++) tfir[i] = fir[1][i];
int xxx = dfs(0,cnt,10000);
now+=xxx;
}
return now;
}
int main(){
//freopen("F:\\program\\rush\\rush_in.txt","r",stdin);
ios::sync_with_stdio(0),cin.tie(0);
memset(fir[0],255,sizeof fir[0]);
cin >> n >> k;
for (int i = 1;i <= n;i++){
cin >> (s+1);
for (int j = 1;j <= n;j++)
if (s[j]=='Y'){
bo[i][j] = 1;
}
}
for (int i = 1;i <= n;i++){
for (int j = 1;j <= 2;j++)
x[i][j] = ++cnt;
}
for (int i = 1;i <= n;i++)
for (int j = 1;j <= 2;j++)
y[i][j] = ++cnt;
cnt++;
for (int i = 1;i <= n;i++){
for (int j = 1;j <= n;j++){
if (bo[i][j])
add(x[i][1],y[j][1],1,0);
else{
add(x[i][2],y[j][2],1,0);
}
}
}
for (int i = 1;i <= n;i++){
add(x[i][1],x[i][2],k,0);
add(y[i][2],y[i][1],k,0);
}
int l = 0,r = n+1,temp1 = 0;
while (l<=r){
int i = (l+r)>>1;
for (int j = 0;j < totm;j++) bian[1][j] = bian[0][j];
for (int j = 0;j <= cnt;j++) fir[1][j] = fir[0][j];
int tt = totm;
for (int j = 1;j <= n;j++){
add(0,x[j][1],i,1);
add(y[j][1],cnt,i,1);
}
int temp = get_flow();
if (temp!=i*n){
r = i-1;
}else {
temp1 = i;
l = i+1;
}
totm = tt;
}
cout<<temp1<<endl;
return 0;
}
【BZOJ 1305】[CQOI2009]dance跳舞的更多相关文章
- bzoj 1305: [CQOI2009]dance跳舞
题目链接 bzoj 1305: [CQOI2009]dance跳舞 题解 男,女生拆点A1A2,B1B2,拆成两点间分别连容量为K的边,限制与不喜欢的人跳舞的数量 A1连接源点容量为x,B1连接汇点容 ...
- BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流
1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...
- 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跳舞 网络最大流_二分答案_建模
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- BZOJ 1305 CQOI2009 dance跳舞 二分答案+最大流
题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连 ...
- bzoj 1305: [CQOI2009]dance 二分+網絡流判定
1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 1340 Solved: 581[Submit][Sta ...
- 1305: [CQOI2009]dance跳舞 - BZOJ
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- 1305: [CQOI2009]dance跳舞
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4169 Solved: 1804[Submit][Status][Discuss] Descripti ...
- BZOJ 1305:dance跳舞(二分+最大流)
一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”).每个男孩 ...
随机推荐
- IDEA解决中文乱码问题
idea在使用过程中经常会遇到各种乱码问题,网上也有很多解决办法,今天所讲的就是终极解决办法: (1)首先,全局搜索文件 idea64.exe.vmoptions 找到之后,将该行代码复制进去即可 ...
- Docker学习总结(14)——从代码到上线, 云端Docker化持续交付实践
2016云栖大会·北京峰会于8月9号在国家会议中心拉开帷幕,在云栖社区开发者技术专场中,来自阿里云技术专家罗晶(瑶靖)为在场的听众带来<从代码到上线,云端Docker化持续交付实践>精彩分 ...
- struts配置问题
- BA-Honeywell R300系统
- 使用SecueCRT在本地主机与远程主机之间交互文件
名词解释 本地主机:执行SecueCRT,以管理远程Linux或Unix的机器(一般为Windows系统) 远程主机:被SecueCRT进行管理控制的机器(一般为Linux或Unix) 1.开启SFT ...
- 菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t
菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...
- Ruby学习(三)——类与对象(1)
今天看了<Ruby元编程>,感觉内容新颖翔实,是Ruby中难得的一见的好书,在此推荐给大家.其实今天看的主要是第一章的第一部分,先把内容梳理一下,也许这一部分会分成几天的内容来给大家介绍吧 ...
- mysqli的简单工具包
mysqli的简单工具包 <?php /** * 连接 * @param string $host * @param string $user * @param string $password ...
- Java基础之关键字
一.Java关键字总览 基本数据类型(9):boolean.char.byte.short.int.long.float.double.null 变量引用(2):super.this 类.方法.变量修 ...
- Ubuntu18.04修改Hostname
1. 设置新的hostnamesudo hostnamectl set-hostname newNameHere 2. 修改配置文件使hostname可以保存编辑这个文件: /etc/cloud/cl ...