思路:
二分答案+最大流。
二分答案$m$,表示最多跳$m$轮。
将每个人拆成两个点$a_i$$b_i$,$a_i$表示与任何人跳舞,$b_i$表示与不喜欢的人跳舞。
对于第$i$个人,连一条从$a_i$到$b_i$的容量为$k$的边,表示与不同的不喜欢的人最多跳$k$次。
对于互相喜欢的男女$i$和$j$,连一条从$a_i$到$a_j$的容量为$1$的边,表示与同一个喜欢的人最多跳$1$次。
对于没有互相喜欢的男女$i$和$j$,连一条从$b_i$到$b_j$的容量为$1$的边,表示与同一个不喜欢的人最多跳$1$次。
建立超级源点$s$和超级汇点$t$。
对于每个男生$i$,连一条从$s$到$a_i$的容量为$m$的边,表示一个人跳$m$次舞。
对于每个女生$j$,连一条从$a_j$到$t$的容量为$m$的边,表示一个人跳$m$次舞。
每次二分时跑网络流,观察是否能够满流,若满流,则表示可以达到$m$轮。

 #include<queue>
#include<vector>
#include<cstring>
#include<iostream>
const int inf=0x7fffffff;
const int N=,E=,V=;
bool like[N][N];
struct Edge {
int from,to,remain;
};
Edge e[E];
std::vector<int> g[V];
int sz=;
inline void add_edge(const int u,const int v,const int w) {
e[sz]=(Edge){u,v,w};
g[u].push_back(sz);
sz++;
}
int n,k,s,t;
inline void init() {
sz=;
for(int i=s;i<t;i++) g[i].clear();
}
inline void setGraph(const int m) {
init();
for(int i=;i<=n;i++) {
add_edge(s,i,m);
add_edge(i,s,);
}
for(int i=;i<=n;i++) {
add_edge(i,i+n,k);
add_edge(i+n,i,);
}
for(int i=;i<=n;i++) {
for(int j=;j<=n;j++) {
if(like[i][j]) {
add_edge(i,j+n*,);
add_edge(j+n*,i,);
}
else {
add_edge(i+n,j+n*,);
add_edge(j+n*,i+n,);
}
}
}
for(int i=;i<=n;i++) {
add_edge(i+n*,i+n*,k);
add_edge(i+n*,i+n*,);
}
for(int i=;i<=n;i++) {
add_edge(i+n*,t,m);
add_edge(t,i+n*,m);
}
}
int a[V],p[V];
inline int Augment() {
memset(a,,sizeof a);
a[s]=inf;
std::queue<int> q;
q.push(s);
while(!q.empty()) {
int x=q.front();
q.pop();
for(unsigned i=;i<g[x].size();i++) {
Edge &y=e[g[x][i]];
if(!a[y.to]&&y.remain) {
a[y.to]=std::min(y.remain,a[x]);
p[y.to]=g[x][i];
q.push(y.to);
}
}
if(a[t]) break;
}
return a[t];
}
inline int EdmondsKarp() {
int maxflow=;
while(int flow=Augment()) {
for(int i=t;i!=s;i=e[p[i]].from) {
e[p[i]].remain-=flow;
e[p[i]^].remain+=flow;
}
maxflow+=flow;
}
return maxflow;
}
inline bool check(const int m) {
setGraph(m);
return EdmondsKarp()==m*n;
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cin>>n>>k;
s=,t=n<<|;
for(int i=;i<=n;i++) {
for(int j=;j<=n;j++) {
char ch;
std::cin>>ch;
like[i][j]=ch=='Y';
}
}
int l=,r=n;
while(l<=r) {
int mid=(l+r)>>;
if(check(mid)) {
l=mid+;
}
else {
r=mid-;
}
}
std::cout<<l-<<std::endl;
return ;
}

[CQOI2009]跳舞的更多相关文章

  1. 题解 P3153 【[CQOI2009]跳舞】

    P3153 [CQOI2009]跳舞 题目描述 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢 ...

  2. [CQOI2009]跳舞 网络流

    题面:[CQOI2009]跳舞 题解: 首先最大时间不好求,而且数据范围很小,所以我们可以先二分一个最大时间,然后就只需要判断是否可行即可. 因此我们每二分一个mid,对于每个女生,连s ---> ...

  3. [BZOJ1305][CQOI2009]跳舞(网络流)

    1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 3944  Solved: 1692[Submit][St ...

  4. 1305. [CQOI2009]跳舞【最大流+二分】

    Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...

  5. 【[CQOI2009]跳舞】

    首先这种匹配类问题一看就是网络流了 之后想一想怎么搞 发现题目的意思是使得跳舞最少的男生跳的舞最多 很自然想到二分答案啊 现在转化成了一个判定性问题,能否使得所有人都跳上\(k\)只舞 由于喜欢和不喜 ...

  6. [洛谷P3153] [CQOI2009]跳舞

    题目大意:有n个女生,n个男生,每次一男一女跳舞.同一队只会跳一次.每个男孩最多只愿意和k个不喜欢的女孩跳舞,女孩同理.问舞会最多能有几首舞曲? 题解:二分跳了多少次舞,每次重建图,建超级原点和汇点, ...

  7. P3153 [CQOI2009]跳舞

    题目描述 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会”单向喜欢“) ...

  8. 题解 P1682 【过家家】

    P1682 过家家 题目描述 有2n个小学生来玩过家家游戏,其中有n个男生,编号为1到n,另外n个女生,编号也是1到n.每一个女生可以先选择一个和她不吵嘴的男生来玩,除此之外,如果编号为X的女生的朋友 ...

  9. AHOI2018训练日程(3.10~4.12)

    (总计:共90题) 3.10~3.16:17题 3.17~3.23:6题 3.24~3.30:17题 3.31~4.6:21题 4.7~4.12:29题 ZJOI&&FJOI(6题) ...

随机推荐

  1. JAVA记录-JSP内容

    JSP(JavaServer Pages )是什么? JavaServer Pages(JSP)是一种支持动态内容开发的网页技术它可以帮助开发人员通过利用特殊的JSP标签,其中大部分以<%开始并 ...

  2. 记webpack下提取公共js代码的方法

    环境: webpack4.6 + html-webpack-plugin 多页面多入口 经多次研究,稍微靠谱可用的配置 optimization: { splitChunks: { minSize: ...

  3. 使用 jquery-autocomplete插件 完成文本框输入自动填充联想效果 解决兼容IE输入中文问题

    项目中有时会用到ajax自动补全查询,就像Google的搜索框中那样,输入汉字或者字母的首个字母,则包含这个汉字或者字母的相关条目会显示出来供用户选择,该插件就是实现这样的功能的.autocomple ...

  4. 使用Sysmon和Splunk探测网络环境中横向渗透

    当前很难在网络中探测攻击者横向渗透,其中原因有很难获取必要的日志和区别正常与恶意行为.本篇文章介绍通过部署Sysmon并将日志发送到SIEM来探测横向渗透. 工具: Sysmon + Splunk l ...

  5. Servlet笔记8--乱码解决方案

    乱码解决方案: 代码详解: package com.bjpowernode.javaweb.servlet; import java.io.IOException; import javax.serv ...

  6. MapReduce--shuffle

    一.Shuffle简介 Shuffle的正常意思是洗牌或弄乱,shuffle的大致范围就是把map task的输出结果有效的传送到Reduce端.也可以这样理解,shuffle描述着数据从map ta ...

  7. MySQL用户密码过期登陆报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

    今天接到主从复制失败告警,查看MySQL,发现MySQL能够登陆但是执行命令报错, ERROR 1820 (HY000): You must reset your password using ALT ...

  8. elasticsearch安装kibana插件

    1.下载 2.解压将解压后的文件放到D:\DevTools\kibana-4.6.0-windows-x86路径下 3.修改配置文件D:\DevTools\kibana-4.6.0-windows-x ...

  9. fastdfs:安装nginx

    #安装依赖 yum -y install gcc yum -y install gcc-c++ yum -y install zlib-devel yum -y install pcre-devel ...

  10. linux下安装redis及其中遇到的问题的解决方法

    1.将下载好的压缩包放到/usr/local目录下# tar xzf redis-3.0.2.tar.gz # cd redis-3.0.2 # make 提示错误 make: cc: Command ...