BZOJ 1305--[CQOI2009]dance跳舞(最大流)
1305: [CQOI2009]dance跳舞
Time Limit: 5 Sec Memory Limit: 162 MB
Submit: 4150 Solved: 1792
[Submit][Status][Discuss]
Description
一次舞会有n个男孩和n个女孩。每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞。每个男孩都不会和同一个女孩跳两首(或更多)舞曲。有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”)。每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞。给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲?
Input
第一行包含两个整数n和k。以下n行每行包含n个字符,其中第i行第j个字符为'Y'当且仅当男孩i和女孩j相互喜欢。
Output
仅一个数,即舞曲数目的最大值。
Sample Input
YYY
YYY
YYY
Sample Output
HINT
N<=50 K<=30
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=1305
Solution
最大流裸题。。。
将每个男孩和女孩拆成两个点,喜欢和不喜欢各自连边。。。
给不喜欢的连一条容量为k的边限一下流就可以了。。。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N 500
#define LL long long
#define inf 1000000000
using namespace std;
inline LL Read(){
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,k,S,T,cnt=1,ans=0,re=0;
int hed[N],h[N],q[1000000];
char s[N];
struct edge{
int r,nxt,v;
}e[1000000];
void insert(int u,int v,int w){
e[++cnt].r=v;e[cnt].nxt=hed[u];hed[u]=cnt;e[cnt].v=w;
e[++cnt].r=u;e[cnt].nxt=hed[v];hed[v]=cnt;e[cnt].v=0;
}
bool bfs(){
int head=0,tail=1,now;
memset(h,-1,sizeof(h));
h[S]=1;q[1]=S;
while(head!=tail){
head++;now=q[head];
for(int i=hed[now];i;i=e[i].nxt)
if(e[i].v&&h[e[i].r]==-1){
h[e[i].r]=h[now]+1;
q[++tail]=e[i].r;
}
}
return h[T]!=-1;
}
int dfs(int x,int F){
if(x==T) return F;
int w,used=0;
for(int i=hed[x];i;i=e[i].nxt)
if(h[x]+1==h[e[i].r]){
w=F-used;
w=dfs(e[i].r,min(e[i].v,w));
e[i].v-=w;
e[i^1].v+=w;
used+=w;
if(used==F) return F;
}
if(!used) h[x]=-1;
return used;
}
void dinic(){
while( bfs() )
ans+=dfs(S,inf);
}
void work(){
for(int i=1;i<=n;i++){
insert(S,i,1);
insert(i+n*2,T,1);
}
ans=0;
dinic();
if(ans==n){
re++;
work();
}
return;
}
int main(){
n=Read();k=Read();
S=0;T=n*4+1;
for(int i=1;i<=n;i++){
insert(i,i+n,k);insert(i+n*3,i+n*2,k);
}
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int j=1;j<=n;j++){
if(s[j]=='Y') insert(i,j+n*2,1);
else insert(i+n,j+n*3,1);
}
}
work();
printf("%d\n",re);
return 0;
}
This passage is made by Iscream-2001.
BZOJ 1305--[CQOI2009]dance跳舞(最大流)的更多相关文章
- BZOJ 1305: [CQOI2009]dance跳舞( 最大流 )
云神代码很短...0 ms过的...看了代码 , 大概是贪心... orz 我不会证 数据这么小乱搞就可以了吧... ←_← 这道题网络流还是可以写的... 既然限制了最多只能和 k 个不喜欢的人da ...
- 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跳舞 二分答案+最大流
题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连 ...
- BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- BZOJ 1305 [CQOI2009]dance跳舞(二分+网络流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1305 [题目大意] 一次舞会有n个男孩和n个女孩. 每首曲子开始时,所有男孩和女孩恰好 ...
- 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对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- BZOJ 1305:dance跳舞(二分+最大流)
一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”).每个男孩 ...
- 1305: [CQOI2009]dance跳舞
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4169 Solved: 1804[Submit][Status][Discuss] Descripti ...
随机推荐
- Halcon的编程语法与数据处理——第8讲
1.跟其他语言不完全一致的表达符号 赋值符号 := 引号 ' ' (一律是单引号) 求商求余 / % (一个整数除以另一个数,如何使商是实型的?即浮点型) 逻辑运算 and or ...
- NSNotificationCenter 注意
成对出现 意思很简单,NSNotificationCenter消息的接受线程是基于发送消息的线程的.也就是同步的,因此,有时候,你发送的消息可能不在主线程,而大家都知道操作UI必须在主线程,不然会出现 ...
- Django入门与实践-第12章:复用模板(完结)
http://127.0.0.1:8000/http://127.0.0.1:8000/boards/1/http://127.0.0.1:8000/boards/2/http://127.0.0.1 ...
- PyCharm2017破解版安装
PyCharm2017破解版安装步骤: 1.右击软件压缩包选择解压到pycharm2017. 2.在解压文件夹里面找到pycharm-professional-171.3780.47,右击打开. 3. ...
- [VC++入门]指针一
俗话说没有搞清楚指针就没有学会C/C++,所以指针是一个相当重要的东东,相当年在用 C#调用C++写的动态链接库时,以为C++中的指针就是C#中的引用类型(ref),但是看了一下却不是这样.指针当然和 ...
- 在centos7.1上安装systemd
1.检查本地systemd的版本 [admin@localhost ~]$ systemctl --version systemd 208 +PAM +LIBWRAP +AUDI ...
- SessionCacheTest03.testLoad Unrooted Tests initializationError
这个错误主要是没有加载@Test这个标签,就是把其转化为一个juit测试的类.增加之后就没有问题了,当然还有很多人说是自己的Juit的版本问题,那就改下版本,还有说是没有加载两个类包,为了完整我就把包 ...
- 用python实现各种排序算法
最简单的排序有三种:插入排序,选择排序和冒泡排序.它们的平均时间复杂度均为O(n^2),在这里对原理就不加赘述了. 贴出源代码: 插入排序: def insertion_sort(sort_list) ...
- wordpaster更新说明
官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/wordpaster/index.aspx 在线演示:FCKEditor2x示例 ...
- git 删除追踪状态
当不小心添加一个不想被git记录等文件时,这个时候就算将该文件记录在了.gitignore里也是没有用的,因为那个文件已经被git记录过了,只有那些从来没有被git记录过的文件(即:自添加进项目后,从 ...