[CQOI2009]跳舞
题目描述
一次舞会有n个男孩和n个女孩。每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞。每个男孩都不会和同一个女孩跳两首(或更多)舞曲。有一些男孩女孩相互喜欢,而其他相互不喜欢(不会”单向喜欢“)。每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞。给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲?
输入格式
第一行包含两个整数n和k。以下n行每行包含n个字符,其中第i行第j个字符为’Y’当且仅当男孩i和女孩j相互喜欢。
输出格式
仅一个数,即舞曲数目的最大值。
输入输出样例
输入 #1复制
3 0
YYY
YYY
YYY
输出 #1复制
3
说明/提示
N<=50 K<=30
我们可以注意到,每一场跳舞都需要n对人,所以我们肯定不能直接跑最大流,因为可能有些人不能匹配,但是有些人能匹配多次。
所以我们需要二分场数。
怎么check呢?
比如我们当前二分的场数为mid,然后我们把人都拆点,分为喜欢和不喜欢,然后限制S到喜欢和不喜欢最大之和为mid,所以我们需要把喜欢和不喜欢的点连在一起,流量为k。
因为没有单向喜欢,所以喜欢的连一起,不喜欢的连一起。
AC代码:
#pragma GCC optimize(2)
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1e3+10,M=1e5+10;
int n,k,s,t,h[N],l,r;
int head[N],nex[M],to[M],w[M],tot;
char g[55][55];
inline void ade(int a,int b,int c){to[++tot]=b; nex[tot]=head[a]; w[tot]=c; head[a]=tot;
}
inline void add(int a,int b,int c){ade(a,b,c); ade(b,a,0);}
inline int bfs(){queue<int> q; q.push(s); memset(h,0,sizeof h); h[s]=1;while(q.size()){int u=q.front(); q.pop();for(int i=head[u];i;i=nex[i]){if(w[i]&&!h[to[i]]){h[to[i]]=h[u]+1; q.push(to[i]);}}}return h[t];
}
int dfs(int x,int f){if(x==t) return f; int fl=0;for(int i=head[x];i&&f;i=nex[i]){if(w[i]&&h[to[i]]==h[x]+1){int mi=dfs(to[i],min(w[i],f));w[i]-=mi; w[i^1]+=mi; fl+=mi; f-=mi;}}if(!fl) h[x]=-1;return fl;
}
inline int dinic(){int res=0;while(bfs()) res+=dfs(s,inf);return res;
}
inline int check(int mid){tot=1; memset(head,0,sizeof head);for(int i=1;i<=n;i++) add(s,i,mid),add(i,i+n,k),add(i+3*n,i+2*n,k),add(i+2*n,t,mid);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(g[i][j]=='Y') add(i,j+2*n,1);else add(i+n,j+3*n,1);}}return dinic()==n*mid;
}
signed main(){cin>>n>>k; l=0,r=n; t=n*4+1;for(int i=1;i<=n;i++) scanf("%s",g[i]+1);while(l<r){int mid=l+r+1>>1;if(check(mid)) l=mid;else r=mid-1;}cout<<l<<endl;return 0;
}
[CQOI2009]跳舞相关推荐
- 有趣题目和认知合集(持续更新)
写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题 算法理解偏向于能懂即可,没有严格的证明 快乐几何 [1.2]Volatile Kite 点到直线 快乐搜与暴力 [2.4]Short Co ...
- 题解 P1682 【过家家】
P1682 过家家 题目描述 有2n个小学生来玩过家家游戏,其中有n个男生,编号为1到n,另外n个女生,编号也是1到n.每一个女生可以先选择一个和她不吵嘴的男生来玩,除此之外,如果编号为X的女生的朋友 ...
- 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跳舞 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 2041 Solved: 853 [ Submit ...
- 【CQOI2009】跳舞
[CQOI2009]跳舞 [题目描述] 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲. 有一些男孩女孩相互喜欢,而 ...
- 【BZOJ 1305】 [CQOI2009]dance跳舞
1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 1586 Solved: 666 [ Submit ...
- 【BZOJ1305】 [CQOI2009]dance跳舞
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- [bzoj1305][CQOI2009]dance跳舞
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- BZOJ1305: [CQOI2009]dance跳舞
[传送门:BZOJ1305] 简要题意: 有n个男生和n个女生,男生和女生之间存在喜欢关系(只可能互相喜欢,不存在单向喜欢),给出一个字符矩阵代表男生女生之间的关系.他们要跳舞,跳舞的时候有歌,可以跳 ...
最新文章
- python 中文转unicode编码_Python 解码 Unicode 转义字符串
- 配置VMware ESXi 5事件发送到SYSLOG服务器
- 【MongoDB数据库】怎样安装、配置MongoDB
- ansible命令应用示例
- uva10160(dfs+状态压缩)
- echo 多行_Java中Scanner的用法:单行多行输入
- Mvvm 前端数据流框架精讲
- python面向对象属性_Python面向对象属性
- 下定决心博客搬家(再见csdn,For my oschina!)
- 反思 大班 快乐的机器人_幼儿园大班音乐优秀教案《小青蛙找家》含反思
- 计算机上缺少vsix安装程序,VSIX安装程序在Visual Studio 2017年(15.3)
- java 罗马数字_罗马数字 | 学步园
- 按键1按下数码管显示1,按键2按下数码管显示2,按键3按下8个LED灯实现流水灯效果;
- 线性代数(五)特征值和特征向量
- leshan基于OMALightweight M2M(LwM2M)协议的Java实现(入门)
- 手机号核验复开是什么意思?可能你涉及到这些行为了!
- 音视频笔记-视锥细胞和视杆细胞的区别
- 20年java面试_Java 20年
- 如何利用Framework模型生成IQD文件
- STM32平台的USART串口通信
热门文章
- 解决配置.zshrc后zsh命令突然失效的问题
- 0x12软考|网络工程师经验分享之下一代互联网(IPv6)
- 途南技术 | 微软OneNote如何导出pdf文件?不完美的小bug
- 微信批量退款php,商户平台-微信批量退款
- 爱车真皮内饰,不容忽视的甲醛安全问题!
- 串口控制74HC164C语言,STM8 74hc164串口输出扩为并口输出子程序
- 法国高等计算机工程学院,法国高等专业学院介绍
- CFileException
- 程序员学会了这套Lambda用法,何尝还会一筹莫展?
- 计算机是我们的抽象方式的自动,米罗超现实抽象画的计算机自动生成