思路:
二分答案+最大流。
二分答案$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. python---django中自带分页类使用

    请先看在学习tornado时,写的自定义分页类:思路一致: python---自定义分页类 1.基础使用: 后台数据获取: from django.core.paginator import Pagi ...

  2. oracle connect by用法篇 (转)

    1.基本语法 select * from table [start with condition1] connect by [prior] id=parentid 1 2 1 2 一般用来查找存在父子 ...

  3. 关于Html class id 命名规范

    CSS命名规则 头:header 内容:content/containe 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中:l ...

  4. 转---一文读懂 python 的元类

    译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得 ...

  5. [转载]JavaScript 的轻框架开发

    http://www.open-open.com/news/view/1d64fed 为什么我们不用 Angular, Ember 或者 Backbone! Muut 是一个特殊的论坛平台,它也有着巨 ...

  6. 利用 ASP.NET 的内置功能抵御 Web 攻击 (1)

    摘要: Dino 总结了最常见的 Web 攻击类型,并介绍了 Web 开发人员可以如何使用 ASP.NET 的内置功能来改进安全性. 一.ASP.NET 开发人员应当始终坚持的做法 如果您正在阅读本文 ...

  7. json转化数组

    //json格式数据 $data = '[{ "F_ModuleId": "1", "F_ParentId": "0", ...

  8. c++刷题(30/100)

    题目一:合并两个排序的链表 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路:利用两个指针cur1,cur2来指分别向两个链表中当前较小的和当前较大的 ...

  9. Batch Normalization 与 Caffe中的 相关layer

    在机器学习领域,通常假设训练数据与测试数据是同分布的,BatchNorm的作用就是深度神经网络训练过程中, 使得每层神经网络的输入保持同分布. 原因:随着深度神经网络层数的增加,训练越来越困难,收敛越 ...

  10. 前后端分离之mockjs实战demo

    基于vue-cli+webpack的demo 项目结构 axios文件夹用来创建axios相关配置: import axios from 'axios' import vue from 'vue' a ...