BZOJ 1305:dance跳舞(二分+最大流)
- 一次舞会有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<= K<=
思路:二分答案,然后最大流。
建图:对于每个男生,拆成两个点A,B(而且A给B分流,流量为K):A用来连接喜欢的女生,B用来连接不喜欢的女生。很明显,二分到num时,给个A拥有num的流量,B拥有K流量。
同理:女生那里也要拆点。并且,男生流出的流和女生进入的流都要加num的限制。
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- const int inf=;
- const int maxn=;
- char mp[][];
- int Laxt[maxn],Next[maxn],To[maxn],cap[maxn],cnt;
- int dis[maxn],vd[maxn],S,N,T,K;
- void add(int u,int v,int val)
- {
- Next[++cnt]=Laxt[u];
- Laxt[u]=cnt;
- To[cnt]=v;
- cap[cnt]=val;
- }
- int sap(int u,int flow)
- {
- if(flow==||u==T) return flow;
- int tmp,delta=;
- for(int i=Laxt[u];i;i=Next[i]){
- if(dis[u]==dis[To[i]]+&&cap[i]>){
- tmp=sap(To[i],min(cap[i],flow-delta));
- delta+=tmp;
- cap[i]-=tmp;
- cap[i^]+=tmp;
- if(delta==flow||dis[S]>T+) return delta;
- }
- }
- vd[dis[u]]--;
- if(vd[dis[u]]==) dis[S]=T+;
- vd[++dis[u]]++;
- return delta;
- }
- bool check(int num)
- {
- int res=; cnt=;
- for(int i=S;i<=T;i++) Laxt[i]=dis[i]=vd[i]=;
- for(int i=;i<=N;i++) { add(S,i,num); add(i,S,); } //分散给男生
- for(int i=;i<=N;i++) { add(i,N+i,K); add(N+i,i,); } //给不喜欢的分配名额
- for(int i=;i<=N;i++)
- for(int j=;j<=N;j++)
- if(mp[i][j]=='Y'){ add(i,*N+j,);add(*N+j,i,); } //给喜欢的女生分配
- else { add(N+i,*N+j,); add(*N+j,N+i,); }//给不喜欢的分配
- for(int i=*N+;i<=*N+N;i++){ add(i,N+i,K); add(T,i,); } //汇聚到女生
- for(int i=*N+;i<=*N+N;i++){ add(i,T,num); add(T,i,); } //汇聚到汇点
- while(dis[S]<=T+) res+=sap(S,inf);
- if(res==num*N) return true;
- return false;
- }
- int main()
- {
- scanf("%d%d",&N,&K); S=; T=*N+;
- for(int i=;i<=N;i++) scanf("%s",mp[i]+);
- int L=,R=N,Mid,ans=;
- while(L<=R){
- Mid=(L+R)>>;
- if(check(Mid)) ans=Mid,L=Mid+;
- else R=Mid-;
- }
- printf("%d\n",ans);
- return ;
- }
BZOJ 1305:dance跳舞(二分+最大流)的更多相关文章
- BZOJ 1305 dance跳舞 二分+最大流
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1305 题目大意: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成 ...
- BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流
1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...
- BZOJ 1305--[CQOI2009]dance跳舞(最大流)
1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4150 Solved: 1792[Submit][St ...
- BZOJ 1305 dance跳舞(最大流+二分答案)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1305 解题思路:转自:https://blog.csdn.net/u012288458/ ...
- bzoj 1305 dance跳舞
最大流. 首先二分答案,问题转化为x首舞曲是否可行. 考虑建图,对每个人建立三个点,分别表示全体,喜欢和不喜欢. 源点向每个男生全体点连一条容量为x的边. 每个男生整体点向喜欢点连一条容量为正无穷的边 ...
- [CQOI2009]dance跳舞(最大流+二分)
[CQOI2009]dance跳舞 每个人拆成$2$个点,表示是否与喜欢的人跳舞 跳$m$首舞曲时,满足最大流为$n*m$ 二分$m$,跑最大流即可 #include<cstdio> #i ...
- BZOJ 1305 CQOI2009 dance跳舞 二分答案+最大流
题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连 ...
- BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- 1305. [CQOI2009]跳舞【最大流+二分】
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- 【BZOJ1305】dance跳舞(最大流,裂点,二分答案)
题意:一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲. 有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”). ...
随机推荐
- XV6第一个进程
第一个进程 本章通过第一个进程的创建来解释 xv6 是如何开始运行的,让我们得以一窥 xv6 提供的各个抽象是如何实现和交互的.xv6 尽量复用了普通操作的代码来建立第一个进程,避免单独为其撰写代码. ...
- Leetcode 274.H指数
H指数 给定一位研究者论文被引用次数的数组(被引用次数是非负整数).编写一个方法,计算出研究者的 h 指数. h 指数的定义: "一位有 h 指数的学者,代表他(她)的 N 篇论文中至多有 ...
- Laya 利用JS进行反射
Laya 利用JS进行反射 @author ixenos 当需要配表调用函数时,可以利用js的eval来调用 1.在配置js中写下: function callAsFunc(funcName){ ev ...
- Android滚动页面位置指示器:CircleIndicator
Android滚动页面位置指示器:CircleIndicator CircleIndicator是github上的一个开源的用于页面滚动时候的位置指示器,指示当前页面在总的页面中的位置和前后位置 ...
- POJ1061青蛙的约会
Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事 ...
- 转载:shell脚本之前的基础知识
转载地址:http://www.92csz.com/study/linux/12.htm 第十二章 学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果 ...
- Codevs 队列练习 合并版
3185 队列练习 1 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定一个队列(初始为空),只有两种操作入队和出队,现给出这 ...
- ztr loves lucky numbers--hdu5676(DFS)
http://acm.hdu.edu.cn/showproblem.php?pid=5676 题目大意: 给你一个数 让你找比这数大并且只含4和7 并且4和7的个数一样 枚举从0到10的18次方之 ...
- delphi 修改文件夹名和文件名
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Form ...
- Visual Studio VS如何修改代码字体
工具-选项-环境-字体和颜色