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

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

输出格式
仅一个数,即舞曲数目的最大值。

输入输出样例
输入 #1复制

3 0
YYY
YYY
YYY

输出 #1复制
3

说明/提示
N<=50 K<=30


我们可以注意到,每一场跳舞都需要n对人,所以我们肯定不能直接跑最大流,因为可能有些人不能匹配,但是有些人能匹配多次。

所以我们需要二分场数。

怎么check呢?
比如我们当前二分的场数为mid,然后我们把人都拆点,分为喜欢和不喜欢,然后限制S到喜欢和不喜欢最大之和为mid,所以我们需要把喜欢和不喜欢的点连在一起,流量为k。

因为没有单向喜欢,所以喜欢的连一起,不喜欢的连一起。


AC代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1e3+10,M=1e5+10;
int n,k,s,t,h[N],l,r;
int head[N],nex[M],to[M],w[M],tot;
char g[55][55];
inline void ade(int a,int b,int c){to[++tot]=b; nex[tot]=head[a]; w[tot]=c; head[a]=tot;
}
inline void add(int a,int b,int c){ade(a,b,c);  ade(b,a,0);}
inline int bfs(){queue<int> q;    q.push(s);  memset(h,0,sizeof h); h[s]=1;while(q.size()){int u=q.front(); q.pop();for(int i=head[u];i;i=nex[i]){if(w[i]&&!h[to[i]]){h[to[i]]=h[u]+1;  q.push(to[i]);}}}return h[t];
}
int dfs(int x,int f){if(x==t) return f; int fl=0;for(int i=head[x];i&&f;i=nex[i]){if(w[i]&&h[to[i]]==h[x]+1){int mi=dfs(to[i],min(w[i],f));w[i]-=mi; w[i^1]+=mi; fl+=mi; f-=mi;}}if(!fl) h[x]=-1;return fl;
}
inline int dinic(){int res=0;while(bfs())  res+=dfs(s,inf);return res;
}
inline int check(int mid){tot=1;   memset(head,0,sizeof head);for(int i=1;i<=n;i++) add(s,i,mid),add(i,i+n,k),add(i+3*n,i+2*n,k),add(i+2*n,t,mid);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(g[i][j]=='Y')    add(i,j+2*n,1);else    add(i+n,j+3*n,1);}}return dinic()==n*mid;
}
signed main(){cin>>n>>k; l=0,r=n; t=n*4+1;for(int i=1;i<=n;i++)  scanf("%s",g[i]+1);while(l<r){int mid=l+r+1>>1;if(check(mid))    l=mid;else r=mid-1;}cout<<l<<endl;return 0;
}

[CQOI2009]跳舞相关推荐

  1. 有趣题目和认知合集(持续更新)

    写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题 算法理解偏向于能懂即可,没有严格的证明 快乐几何 [1.2]Volatile Kite 点到直线 快乐搜与暴力 [2.4]Short Co ...

  2. 题解 P1682 【过家家】

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

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

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

  4. bzoj1305【CQOI2009】dance 跳舞

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

  5. 【CQOI2009】跳舞

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

  6. 【BZOJ 1305】 [CQOI2009]dance跳舞

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

  7. 【BZOJ1305】 [CQOI2009]dance跳舞

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

  8. [bzoj1305][CQOI2009]dance跳舞

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

  9. BZOJ1305: [CQOI2009]dance跳舞

    [传送门:BZOJ1305] 简要题意: 有n个男生和n个女生,男生和女生之间存在喜欢关系(只可能互相喜欢,不存在单向喜欢),给出一个字符矩阵代表男生女生之间的关系.他们要跳舞,跳舞的时候有歌,可以跳 ...

最新文章

  1. hdu2594 简单KMP
  2. 老徐杂谈:年后的第一个双休,你在做什么?
  3. 滴滴与能链杀红眼的加油市场,究竟有多大?
  4. 【VBS】一款无聊的 Visual Basic Script 表白程序
  5. 28 POSIX Threads
  6. 各种机器学习和深度学习的中文微博情感分析
  7. 计算机工具栏查看,win10工具栏显示网速小工具_技术教程
  8. bm3d算法matlab,BM3D算法实现图像降噪.doc
  9. 第九周 单片机的定时器与计数器 模式寄存器TMOD 控制寄存器TCON
  10. Worthington核糖核酸酶B历史和化学性质说明
  11. [教程] 如何复活一个完全死机的联发科设备
  12. 1.1、什么是编程?
  13. 一文掌握多分类logistic回归
  14. java EE crm代码_基于jsp的小型企业CRM-JavaEE实现小型企业CRM - java项目源码
  15. moses(mosesdecoder)数据预处理BPE分词moses用法总结
  16. 苏州源特VPT87DDF01B 隔离变压器 小体积/SMD/3000VDC 隔离
  17. 牛客 15898 黑猫的小老弟【法里数列】
  18. 基于51单片机控制的篮球比赛计时、计分系统设计与仿真(含设计图和C语言程序源码)
  19. java继承a mya new c,java – 为什么外部类不能扩展内部类?
  20. linux shell下求文件的交集、并集、差集

热门文章

  1. [编程题] 等差数列
  2. 对计算机技术的发展方向研究,现代计算机技术的发展方向趋势
  3. 微处理器与嵌入式linux,嵌入式系统微处理器和PC端系统微处理器的最大区别
  4. 机房UPS电源,突然短路了怎么处理?
  5. 李子柒视频深度分析[从数据角度]
  6. 《代码敲不队》第二次作业:团队项目选题报告
  7. line-hight-(行高)解析
  8. 提问的智慧: 如何适当的提出问题。
  9. 新版(第四版)软考口袋书 221-240 重点内容
  10. 简单小游戏——十步万度