首先这种匹配类问题一看就是网络流了

之后想一想怎么搞

发现题目的意思是使得跳舞最少的男生跳的舞最多

很自然想到二分答案啊

现在转化成了一个判定性问题,能否使得所有人都跳上\(k\)只舞

由于喜欢和不喜欢的人放在一起并不好限制,于是只能拆点

于是我们把每个男生拆成三个点,其中一个点用来限制流量,一个点用来连喜欢的女生,另一个用来连不喜欢的女生

超级源点和所有限制流量的点先连一条容量为\(mid\)的边,之后这个点向喜欢的点连一条\(INF\)的边,表示喜欢的女生可以无限选,之后向不喜欢那个点连一条容量为\(m\)的边,表示不喜欢的女生最多选择\(m\)个

女生那边也按照上面的方式拆点,之后按照喜欢和不喜欢连边就好了

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define re register
#define maxn 305
#define INF 99999999
#define LL long long
#define min(a,b) ((a)<(b)?(a):(b))
struct E
{
int v,nxt,w,f;
}e[maxn*maxn];
int num,head[maxn],cur[maxn],d[maxn];
int S,T;
int n,m;
char s[51][51];
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
inline void add_edge(int x,int y,int w){e[++num].v=y,e[num].nxt=head[x],head[x]=num,e[num].w=w;}
inline void C(int x,int y,int w){add_edge(x,y,w),add_edge(y,x,0);}
inline int BFS()
{
std::queue<int> q;
for(re int i=S;i<=T;i++) cur[i]=head[i];memset(d,0,sizeof(d));
d[S]=1,q.push(S);
while(!q.empty())
{
int k=q.front();q.pop();
for(re int i=head[k];i;i=e[i].nxt)
if(!d[e[i].v])
{
if(e[i].w<=e[i].f) continue;
d[e[i].v]=d[k]+1;
q.push(e[i].v);
}
}
return d[T];
}
int dfs(int x,int now)
{
if(x==T||!now) return now;
int flow=0,ff;
for(re int& i=cur[x];i;i=e[i].nxt)
if(d[e[i].v]==d[x]+1)
{
ff=dfs(e[i].v,min(e[i].w-e[i].f,now));
if(ff<=0) continue;
now-=ff,flow+=ff;
e[i].f+=ff,e[i^1].f-=ff;
if(!now) break;
}
return flow;
}
inline int check(int x)
{
num=1,memset(head,0,sizeof(head)),memset(e,0,sizeof(e));
for(re int i=1;i<=n;i++) C(S,i,x);
for(re int i=5*n+1;i<=6*n;i++) C(i,T,x);
for(re int i=1;i<=n;i++) C(i,i+n,INF),C(i,i+n+n,m);
for(re int i=5*n+1;i<=6*n;i++) C(i-n-n,i,INF),C(i-n,i,m);
for(re int i=1;i<=n;i++)
for(re int j=1;j<=n;j++)
if(s[i][j]=='Y') C(i+n,j+n+n+n,1);else C(i+n+n,j+n+n+n+n,1);
int now=0;
while(BFS()) now+=dfs(S,INF);
return now==n*x;
}
int main()
{
n=read(),m=read();
for(re int i=1;i<=n;i++) scanf("%s",s[i]+1);
S=0,T=6*n+1;
int l=0,r=n,ans=0;
while(l<=r)
{
int mid=l+r>>1;
if(check(mid)) l=mid+1,ans=mid;
else r=mid-1;
}
printf("%d\n",ans);
return 0;
}

【[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. [CQOI2009]跳舞

    思路:二分答案+最大流.二分答案$m$,表示最多跳$m$轮.将每个人拆成两个点$a_i$$b_i$,$a_i$表示与任何人跳舞,$b_i$表示与不喜欢的人跳舞.对于第$i$个人,连一条从$a_i$到$ ...

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

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

  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. .NET中的集合-ArrayList2

    数组特点:类型同统一,长度固定 集合常用操作 添加 遍历 移除 ArrayList可变长度数组,使用类似于数组 属性:capacity(集合中可以容纳元素的个数,翻倍增长)count(集合中实际存放的 ...

  2. 清空控件的TeXt属性

    foreach (Control item in groupBox1.Controls) { if (item is TextBox) //判断控件是不是TextBox { item.Text = & ...

  3. Transfer-Encoding:chunked 返回数据过长导致中文乱码

    最近在写一个项目的后台时,前端请求指定资源后,返回JSON格式的数据,突然发现在返回的字节数过大时,最后的message中文数据乱码了,对于同一个接口的请求:当数据小时不会乱码,当数据量大了中文就乱码 ...

  4. 解决MyEclipse代码编辑器中汉字太小的问题

    1.问题描述: 新安装的myeclipse 2014,代码编辑器中汉字很小看不清,如下图所示: 2.解决办法: 调整字体即可.通过菜单Windows——Preferences,输入font过滤选择Co ...

  5. mac关闭渐隐和弹出动画效果

    苹果系统应用程序的窗口和对话框每次使用的时候都有华丽的特效,但是如果你感觉这种特效显得有点慢(MacGG闲的蛋疼),那该如何取消掉他呢? 方法很简单,打开"终端"(Finder-& ...

  6. 【转载】python实例手册

    今天写爬虫的时候遇到了问题,在网上不停地查找资料,居然碰到两篇好文章: 1.python实例手册   作者:没头脑的土豆 另一篇在这:shell实例手册 python实例手册 #encoding:ut ...

  7. AE+C#实现:在SceneControl里打开和保存

    来自:http://www.cnblogs.com/zhuxy/archive/2012/03/30/2424672.html 之前编写这段代码,发现一直没有C#编写的,现在贴出来,希望对大家有用 此 ...

  8. MPU/SoC/Application Processor/Embedded OS

    Everything has its principles and mechanisms which are designed by its creator and followed by its u ...

  9. Install Java JDK JRE on Ubuntu/Debian with Apt-Get

    Introduction As a lot of articles and programs require to have Java installed, this article will gui ...

  10. android studio 3.0 以上 查看sharedpreference

    android studio 3.0 以上 查看sharedpreference 点击android studio 右侧的device file explore,找到data / data 目录: 找 ...