1305: [CQOI2009]dance跳舞

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 3944  Solved: 1692
[Submit][Status][Discuss]

Description


次舞会有n个男孩和n个女孩。每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞。每个男孩都不会和同一个女孩跳两首(或更多)舞曲。有一些男孩女孩相
互喜欢,而其他相互不喜欢(不会“单向喜欢”)。每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞。给出每对男
孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲?

Input

第一行包含两个整数n和k。以下n行每行包含n个字符,其中第i行第j个字符为'Y'当且仅当男孩i和女孩j相互喜欢。

Output

仅一个数,即舞曲数目的最大值。

Sample Input

3 0
YYY
YYY
YYY

Sample Output

3

HINT

N<=50 K<=30

Source

[Submit][Status][Discuss]

显然是一个二分图匹配的问题,将每个人拆成两个点:喜欢点i和讨厌点i',每个限制依次考虑:

1.一对只跳一次:喜欢则i和j连1的边,讨厌则i'和j'连1的边。

2.讨厌至多k个:i向i'连k的边,j'向j连k的边。

3.但是这样直接跑之后并不能得到结果,因为不保证同性之间没有冲突,所以必须二分答案mid,S向i连mid边,j向T连mid边。

跑$O(\log n)$次最大流即可。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
using namespace std; const int N=,M=,inf=0x3f3f3f3f;
char ch;
int n,k,cnt,ans,mx,mid,S,T,d[N],q[M],h[N],f[M],nxt[M],to[M],mp[N][N]; void add(int u,int v,int w){
to[++cnt]=v; f[cnt]=w; nxt[cnt]=h[u]; h[u]=cnt;
to[++cnt]=u; f[cnt]=; nxt[cnt]=h[v]; h[v]=cnt;
} int bfs(){
rep(i,,T) d[i]=; d[S]=; q[]=S;
for (int st=,ed=; st!=ed; ){
int x=q[++st];
For(i,x) if (!d[k=to[i]] && f[i]) q[++ed]=k,d[k]=d[x]+;
}
return d[T];
} int dfs(int x,int lim){
if (x==T) return lim;
int c=,t;
For(i,x) if (d[k=to[i]]==d[x]+ && f[i]){
t=dfs(k,min(lim-c,f[i]));
f[i]-=t; f[i^]+=t; c+=t;
if (c==lim) return lim;
}
if (!c) d[x]=-;
return c;
} void build(){
cnt=; memset(h,,sizeof(h));
S=*n+,T=*n+;
rep(i,,n) add(S,i,mid),add(i,i+n,k),add(i+*n,i+*n,k),add(i+*n,T,mid);
rep(i,,n) rep(j,,n) if (mp[i][j]) add(i,j+*n,); else add(i+n,j+*n,);
} int main(){
freopen("bzoj1305.in","r",stdin);
freopen("bzoj1305.out","w",stdout);
scanf("%d%d",&n,&k);
rep(i,,n) rep(j,,n) scanf(" %c",&ch),mp[i][j]=(ch=='Y');
int L=,R=n;
while (L<=R){
mid=(L+R)>>; build();
ans=; while (bfs()) ans+=dfs(S,inf);
if (ans>=n*mid) mx=mid,L=mid+; else R=mid-;
}
printf("%d\n",mx);
return ;
}

[BZOJ1305][CQOI2009]跳舞(网络流)的更多相关文章

  1. [CQOI2009]跳舞 网络流

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

  2. 【BZOJ1305】跳舞(网络流)

    [BZOJ1305]跳舞(网络流) 题面 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一 ...

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

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

  4. BZOJ1305 [CQOI2009]dance跳舞 【网络流】

    1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 3714  Solved: 1572 [Submit][ ...

  5. bzoj1305: [CQOI2009]dance跳舞(二分答案+网络流)

    1305: [CQOI2009]dance跳舞 题目:传送门 题解: 一眼网络流基础建模...然后就GG了 二分答案+拆点建边+最大流判断: 把男女生拆为男1,男2,女1,女2 1.男1和男2还有女1 ...

  6. Bzoj1305 [CQOI2009]dance跳舞

    Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 2925  Solved: 1221 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时 ...

  7. bzoj千题计划130:bzoj1305: [CQOI2009]dance跳舞

    http://www.lydsy.com/JudgeOnline/problem.php?id=1305 每个人拆为喜欢(yes)和不喜欢(no)两个点 二分答案 1.每两个人之间只能跳一次 喜欢则 ...

  8. 并不对劲的bzoj1305: [CQOI2009]dance跳舞

    传送门-> 又是陈年老坑. 听上去不知道从何下[手]?那要是把题目换成“判断这些人能否条x支舞”呢? 这样就变成了一个网络流可以解决的问题,只要把每个人拆成喜欢和不喜欢两点,每个人两点总流量不超 ...

  9. 【二分答案】【最大流】bzoj1305 [CQOI2009]dance跳舞

    http://hzwer.com/1986.html #include<cstdio> #include<algorithm> #include<queue> #i ...

随机推荐

  1. Spring归纳小结(山东数漫江湖)

    前言 如果说有什么框架是Java程序员必然会学习.使用到的,那么Spring肯定是其中之一.本篇博客,将根据博主在日常工作中对Spring的使用做一个系统的归纳小结. Spring的一些概念和思想 S ...

  2. apache log 按日期记录 格式 <GOOD>-- (转)

    在apache的配置文件中找到ErrorLog logs/error_logCustomLog logs/access_log common Linux系统配置方法: 将其改为ErrorLog “| ...

  3. SQL Workbench/J

    最近测试segment, 使用了一个新的DB--SQL Workbench/J, 参考文档:http://docs.aws.amazon.com/redshift/latest/mgmt/connec ...

  4. java 和 JVM

    C++和Java的区别 指针:java中不存在指针的概念,编程者无法直接通过指针来直接访问内存,有利于维护java程序的安全 多重继承:C++支持多重继承,java不支持多重继承,但是允许一个类继承多 ...

  5. PHP的输出方式

    php中,用echo输出一个字符串有三种方式,分别是单引号,双引号和<<<方式.其中,单引号中的变量不会被解析,而会直接输出,而双引号和<<<时,变量会被解析.&l ...

  6. JQuery一个对象绑定多个事件

    jQuery("#id").click(func1).mouseover(func2)//方法连写,func为方法的名字 jQuery("#id").click ...

  7. Leetcode 之Binary Tree Preorder Traversal(42)

    树的先序遍历.定义一个栈,先压入中间结点并访问,然后依次压入右.左结点并访问. vector<int> preorderTraversal(TreeNode *root) { vector ...

  8. LCT 文档

    file:///C:/Users/Frank/Downloads/QTREE%E8%A7%A3%E6%B3%95%E7%9A%84%E4%B8%80%E4%BA%9B%E7%A0%94%E7%A9%B ...

  9. python基础(2)---数据类型

    1.python版本间的差异: 2.x与3.x版本对比 version 2.x 3.x print print " "或者print()打印都可以正常输出 只能print()这种形 ...

  10. 【hdoj_2152】Fruit(母函数)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2152 本题采用母函数模板求解,母函数模板如下: http://blog.csdn.net/ten_sory ...