题干:

一次舞会有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

解题报告:

这题网络流,做法很多。可以直接二分可以跳多少支舞,然后网络流check一下。也可以每次每次的跑,直到第一次凑不满n个人为止。也可以每次给他一条流量为1的空间,让他凑n个人,然后再给他流量为1的空间,让他在残留网络上凑n个人,这样直到第一次凑不出n个人的时候break。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
int n,k,N;
int tot;
struct Edge {int to,ne,w;
} e[100005 * 2];
int head[10005];
int st,ed;
int dis[10050],q[10005];
void add(int u,int v,int w,int rw=0) {e[++tot].to=v;e[tot].w=w;e[tot].ne=head[u];head[u]=tot;e[++tot].to=u;e[tot].w=rw;e[tot].ne=head[v];head[v]=tot;
}
bool bfs(int st,int ed) {memset(dis,-1,sizeof(dis));int front=0,tail=0;q[tail++]=st;dis[st]=0;while(front<tail) {int cur = q[front];if(cur == ed) return 1;front++;for(int i = head[cur]; i!=-1; i = e[i].ne) {if(e[i].w&&dis[e[i].to]<0) {q[tail++]=e[i].to;dis[e[i].to]=dis[cur]+1;}}}if(dis[ed]==-1) return 0;return 1;
}
int dfs(int cur,int limit) {//limit为源点到这个点的路径上的最小边权 if(limit==0||cur==ed) return limit;int w,flow=0;for(int i = head[cur]; i!=-1; i = e[i].ne) {        if(e[i].w&&dis[e[i].to]==dis[cur]+1) {w=dfs(e[i].to,min(limit,e[i].w));e[i].w-=w;e[i^1].w+=w;flow+=w;limit-=w;if(limit==0) break;}}if(!flow) dis[cur]=-1;return flow;
}
int dinic() {int ans = 0;while(bfs(st,ed)) ans+=dfs(st,0x7fffffff);return ans;
}
char s[55][55];
int main() {cin>>n>>k;st=4*n+1,ed=st+1;N=ed+1;//init tot=1;for(int i = 1; i<=N; i++) head[i] = -1;for(int i = 1; i<=n; i++) {scanf("%s",s[i]+1);add(i,i+n,k);add(i+2*n,i+3*n,k);        }for(int i = 1; i<=n; i++) {for(int j = 1; j<=n; j++) {if(s[i][j] == 'Y') add(i,j+3*n,1);else add(i+n,j+2*n,1);}}for(int ans = 0; ;ans++) {for(int i = 1; i<=n; i++) {add(st,i,1);add(3*n+i,ed,1);}if(dinic() != n) {printf("%d\n",ans);break;}              }           return 0;
}

【BZOJ - 1305】dance跳舞(拆点网络流,建图,最大流,残留网络上跑最大流)相关推荐

  1. BZOJ 1305 dance跳舞 二分+最大流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1305 题目大意: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成 ...

  2. BZOJ 1305 dance跳舞(最大流+二分答案)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1305 解题思路: 转自:https://blog.csdn.net/u012288458 ...

  3. 2016 计蒜之道 复赛 菜鸟物流的运输网络【拆点+思维建图+网络流】

    菜鸟物流的运输网络 菜鸟物流有自己的运输网络,网络中包含 nn 个城市物流集散中心,和 mm 对城市之间的运输线路(线路是双向的).菜鸟物流允许淘宝卖家自行确定包裹的运输路径,但只有一条限制规则:不允 ...

  4. 【UOJ575】光伏元件【网络流建图】【上下界网络流】【费用流】

    题意: n×nn\times nn×n 的 01 矩阵,对于 i∈[1,n]i \in [1,n]i∈[1,n] 有三个参数 li,li,kil_i,l_i,k_ili​,li​,ki​,表示第 ii ...

  5. 网络流建图方法(二)——辅助点(虚点)决策法洛谷 P1361 小M 的作物 Dinic

    inic声明:本博客默认读者会最大流最小割的定理,会Dinic, 最小割在数值上 == 最大流 但是在意义上没有任何关系,姑且可以这样求得最小割,当然可以自行百度最小割的证明定理 还是从题目开始说起 ...

  6. HDU4411 Arrest(负边权或上下界网络流建图)

    牵涉到必须经过每个点至少一次,所以拆点 把点iii拆分为iii和i+ni+ni+n iii到i+ni+ni+n可以走多次,但至少需要经过一次(代表经过这个点) 所以iii到i+ni+ni+n首先连一条 ...

  7. BZOJ.3495.[PA2010]Riddle(2-SAT 前缀优化建图)

    题目链接 每个城市要么建首都要么不建,考虑2-SAT 这样一个国家内城市两两连边是很显然的,但是边数为O(n^2) 每个国家中仅有一个建首都,考虑新建前缀S[i]=1/0这2n个点表示当前国家的[1, ...

  8. HDU 3338 网络流 建图

    原题位置http://acm.hdu.edu.cn/showproblem.php?pid=3338 这道题的意思就是 给你一个由黑白方格构成的图 白方格全部空着 黑方格有的会有数字 在左下角的数字表 ...

  9. [ZJOI2010] 贪吃的老鼠(二分+差分+神仙建图网络流)

    problem luogu-P2570 solution 卧槽网络流尼玛神题 首先这个最小延长时间 TTT ,套路地考虑二分,将问题转化为判定性问题. 其次 n,mn,mn,m 和奶酪存在时间 [l, ...

最新文章

  1. Python生物信息学③提取差异基因
  2. 「小程序JAVA实战」微信开发者工具helloworld(三)
  3. pycharm 调试(debug)模式时界面上的 mute breakpoint 是什么意思?(239)
  4. I - Ant Trip (无向图欧拉回路+并查集),判断
  5. Linux环境 Oracle 监听和服务 日常操作
  6. CodeForces1005D - Polycarp and Div 3
  7. ci github 通知_GitHub 欢迎一切 CI 工具
  8. gif动态表情包怎么制作?
  9. 网线传输速度测试_「网络速度测试」网络速度测试 - seo实验室
  10. B 站顶流何同学对话苹果 CEO 库克
  11. 20多岁的年纪,做什么将来才不后悔?
  12. H5 iOS 自动调起软键盘
  13. 配置 OpenStack 命令 自动 补全
  14. python中的数据分析库有哪些_五大常用数据科学Python库
  15. 查询计算机系教师开设的所有课程的课程号和课程名
  16. 用Python自动生成Excel数据报表!
  17. cesium的鼠标事件
  18. 【推荐系统入门到项目实战】(三):矩阵分解和ALS算法
  19. 迄今最全人脸识别开源
  20. 在线长篇英语文章翻译工具

热门文章

  1. [代码阅读] ECS toString实现方法
  2. HDU 6168 Numbers 思维
  3. linux如何创建备份文件,如何备份Linux 配置文件
  4. 休眠后gpio状态_1.Linux电源管理-休眠与唤醒
  5. php全局cors,PHP开启CORS - slagga的个人页面 - OSCHINA - 中文开源技术交流社区
  6. redis查询所有key命令_想在生产搞事情?那试试这些 Redis 命令
  7. __thread 和 __typeof__关键字
  8. VxWorks嵌入式操作系统的TrueFFS文件系统驱动开发
  9. wince6.0编译命令分析
  10. Hive-Based Registry使用