BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模
Description
一次舞会有n个男孩和n个女孩。每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞。每个男孩都不会和同一个女孩跳两首(或更多)舞曲。有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”)。每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞。给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲?
Input
第一行包含两个整数n和k。以下n行每行包含n个字符,其中第i行第j个字符为'Y'当且仅当男孩i和女孩j相互喜欢。
Output
仅一个数,即舞曲数目的最大值。
题解:
二分的答案为 $a$.
把每个人拆成两个点,从“喜欢”到“不喜欢”连一条容量为 $k$ 的边.
从 $S$ 向“男孩喜欢”连一条容量为 $a$ 的边,从“女孩喜欢”往 $T$ 连一条容量为 $a$ 的边.
然后对于每对男孩女孩:
1. 不喜欢: 从“男孩不喜欢”到“女孩不喜欢”连一条容量为 $1$ 的边.
2. 喜欢:从“男孩喜欢”到“女孩喜欢”连一条容量为 $1$ 的边.

// luogu-judger-enable-o2
#include <bits/stdc++.h>
#define maxn 400
#define inf 10000000
#define setIO(s) freopen(s".in","r",stdin)
#define r1(i) i
#define r2(i) (i+n)
#define r3(i) (i+n+n)
#define r4(i) (i+n+n+n)
using namespace std;
char str[100];
int G[maxn][maxn];
namespace Dinic{
struct Edge{
int from,to,cap;
Edge(int u=0,int v=0,int c=0):from(u),to(v),cap(c){}
};
vector<int>G[maxn];
vector<Edge>edges;
queue<int>Q;
int vis[maxn],d[maxn],curr[maxn];
int s,t;
void addedge(int u,int v,int c){
edges.push_back(Edge(u,v,c)),edges.push_back(Edge(v,u,0));
int m=edges.size();
G[u].push_back(m-2),G[v].push_back(m-1);
}
int BFS(){
memset(vis,0,sizeof(vis));
d[s]=0,vis[s]=1, Q.push(s);
while(!Q.empty()){
int u=Q.front();Q.pop();
for(int sz=G[u].size(),i=0;i<sz;++i){
Edge r=edges[G[u][i]];
if(!vis[r.to]&&r.cap>0) {
vis[r.to]=1,d[r.to]=d[u]+1;
Q.push(r.to);
}
}
}
return vis[t];
}
int dfs(int x,int cur){
if(x==t) return cur;
int f,flow=0;
for(int sz=G[x].size(),i=curr[x];i<sz;++i){
curr[x]=i;
Edge r=edges[G[x][i]];
if(d[r.to]==d[x]+1&&r.cap>0){
f=dfs(r.to,min(cur,r.cap));
cur-=f,flow+=f,edges[G[x][i]].cap-=f,edges[G[x][i]^1].cap+=f;
}
if(cur<=0) break;
}
return flow;
}
int maxflow(){
int flow=0;
while(BFS()) memset(curr,0,sizeof(curr)),flow+=dfs(s,inf);
return flow;
}
void re(){
for(int i=0;i<maxn;++i) G[i].clear();
edges.clear();
}
};
int n,k;
bool check(int t){
Dinic::re();
Dinic::s=0,Dinic::t=396;
for(int i=1;i<=n;++i) {
Dinic::addedge(r1(i),r2(i),k);
Dinic::addedge(r3(i),r4(i),k);
Dinic::addedge(Dinic::s,r1(i),t);
Dinic::addedge(r4(i),Dinic::t,t);
for(int j=1;j<=n;++j) {
if(G[i][j])
Dinic::addedge(r1(i),r4(j),1);
else
Dinic::addedge(r2(i),r3(j),1);
}
}
return Dinic::maxflow()==t*n;
}
int main(){
// setIO("input");
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i){
scanf("%s",str+1);
for(int j=1;j<=n;++j) if(str[j]=='Y') G[i][j]=1;
}
int l=1,r=n,mid,ans=0;
while(l<=r){
mid=(l+r)>>1;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d",ans);
return 0;
}
BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模的更多相关文章
- 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跳舞( 最大流 )
云神代码很短...0 ms过的...看了代码 , 大概是贪心... orz 我不会证 数据这么小乱搞就可以了吧... ←_← 这道题网络流还是可以写的... 既然限制了最多只能和 k 个不喜欢的人da ...
- BZOJ 1305 CQOI2009 dance跳舞 二分答案+最大流
题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连 ...
- 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 ...
- [CQOI2009]dance跳舞(最大流+二分)
[CQOI2009]dance跳舞 每个人拆成$2$个点,表示是否与喜欢的人跳舞 跳$m$首舞曲时,满足最大流为$n*m$ 二分$m$,跑最大流即可 #include<cstdio> #i ...
- 1305: [CQOI2009]dance跳舞 - BZOJ
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- BZOJ 1305:dance跳舞(二分+最大流)
一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”).每个男孩 ...
随机推荐
- Git 基础教程 之 添加、提交
一, 编写一个名为readme.txt文件,放入pythonwork目录下 ① 手动新建 ② 使用命令: a. touch readme.txt b. vim readme.txt PS: ...
- Java开发编码规范
第一章 代码开发规范及其指南 一.1 目的 定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失.(这些规范并不是一定要绝对遵守,但是一定要让程序有 ...
- PixelUtils:像素转换工具
/** 像素转换工具 */ public class PixelUtils { /** * The context. */ private static Context mContext = Cust ...
- 设计模式C++实现——组合模式
模式定义: 组合模式同意你将对象组合成树形结构来表现"总体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 这个模式可以创建一个树形结构,在同一个结构中处理嵌套 ...
- Windows 7下Git SSH 创建Key【待解决?】
1.在桌面右键,git bash here 2.检查本机是否有ssh key设置 $ cd ~/.ssh 或cd .ssh 如果没有则提示: No such file or directory:此时需 ...
- xcode Automatic signing is unable to resolve an issue with the "ShowCar-IOS" target's entitlements
1.https://stackoverflow.com/questions/37806538/code-signing-is-required-for-product-type-application ...
- Hadoop-2.2.0中文文档——Apache Hadoop 下一代 MapReduce (YARN)
MapReduce在hadoop-0.23中已经经历了一次全然彻底地大修.就是如今我们叫的MapReduce 2.0 (MRv2) or YARN. MRv2的基本思想是把JobTracker分成两个 ...
- 《游戏脚本的设计与开发》-(RPG部分)3.8 通过脚本来自由控制游戏(一)
注意:本系列教程为长篇连载无底洞.半路杀进来的朋友,假设看不懂的话.请从第一章開始看起.文章文件夹请点击以下链接. http://blog.csdn.net/lufy_legend/article/d ...
- luogu1226 取余运算||快速幂
题目大意:快速求$a^b\mod p$的值. 根据二进制,令$b=\sum t_k\cdot 2^k, t\in \{0,1\}$,那么$$a^b=a^{\sum t_k\cdot 2^k}\mod ...
- oc11---结构体作为属性
// // main.m // 结构体作为对象的属性 #import <Foundation/Foundation.h> typedef struct { int year; int mo ...