最大流。

首先二分答案,问题转化为x首舞曲是否可行。

考虑建图,对每个人建立三个点,分别表示全体,喜欢和不喜欢。

源点向每个男生全体点连一条容量为x的边。

每个男生整体点向喜欢点连一条容量为正无穷的边,向不喜欢点连一条容量为k的边。

每个男生喜欢点向所有他喜欢的女生的喜欢点连一条容量为一的边,不喜欢点向所有他不喜欢的女生的不喜欢点连一条容量为一的边。

每个女生喜欢点向整体点连一条容量为正无穷的边,不喜欢点向整体点连一条容量为k的边。

每个女生整体点向汇点连一条容量为x的边。

check即为判断最大流是否等于n*x。

本题中流量的定义为舞曲数,整体点向源汇点的连边保证了每一轮正好配成n对,如某一轮中存在一个女生对应多个男生,最终最大流就会减小。

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int dian=;
const int bian=;
const int INF=0x3f3f3f3f;
int n,k,tot;
int S,T;
int h[dian],nxt[bian],ver[bian],val[bian],ch[dian];
char map[][];
void add(int aa,int bb,int cc){
tot++;ver[tot]=bb;val[tot]=cc;nxt[tot]=h[aa];h[aa]=tot;
tot++;ver[tot]=aa;val[tot]=;nxt[tot]=h[bb];h[bb]=tot;
}
int bh(int aa,int p,int ok){
return (aa-)*+p+ok**n;
}
bool tell(){
memset(ch,-,sizeof(ch));
queue<int>q;
q.push(S);
ch[S]=;
while(!q.empty()){
int t=q.front();
q.pop();
for(int i=h[t];i;i=nxt[i])
if(ch[ver[i]]==-&&val[i]){
q.push(ver[i]);
ch[ver[i]]=ch[t]+;
}
}
return ch[T]!=-;
}
int zeng(int a,int b){
if(a==T)
return b;
int r=;
for(int i=h[a];i&&b>r;i=nxt[i])
if(ch[ver[i]]==ch[a]+&&val[i]){
int t=zeng(ver[i],min(b-r,val[i]));
val[i]-=t,r+=t,val[i^]+=t;
}
if(!r)
ch[a]=-;
return r;
}
int dinic(){
int r=,t;
while(tell())
while(t=zeng(S,INF))
r+=t;
return r;
}
bool check(int mid){
memset(nxt,,sizeof(nxt));
memset(h,,sizeof(h));
tot=;
for(int i=;i<=n;i++){
add(S,bh(i,,),mid);
add(bh(i,,),T,mid);
add(bh(i,,),bh(i,,),INF);
add(bh(i,,),bh(i,,),k);
add(bh(i,,),bh(i,,),INF);
add(bh(i,,),bh(i,,),k);
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
if(map[i][j]=='Y')
add(bh(i,,),bh(j,,),);
else
add(bh(i,,),bh(j,,),);
}
if(dinic()==n*mid)
return true;
return false;
}
int bin(int l,int r){
int mid;
while(l<r){
mid=(l+r+)>>;
if(check(mid))
l=mid;
else
r=mid-;
}
return l;
}
int main(){
scanf("%d%d",&n,&k);
S=*n+,T=*n+;
for(int i=;i<=n;i++)
scanf("%s",map[i]+);
printf("%d",bin(,));
return ;
}

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. BZOJ 1305--[CQOI2009]dance跳舞(最大流)

    1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4150  Solved: 1792[Submit][St ...

  4. bzoj 1305: [CQOI2009]dance跳舞

    题目链接 bzoj 1305: [CQOI2009]dance跳舞 题解 男,女生拆点A1A2,B1B2,拆成两点间分别连容量为K的边,限制与不喜欢的人跳舞的数量 A1连接源点容量为x,B1连接汇点容 ...

  5. BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流

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

  6. BZOJ 1305: [CQOI2009]dance跳舞( 最大流 )

    云神代码很短...0 ms过的...看了代码 , 大概是贪心... orz 我不会证 数据这么小乱搞就可以了吧... ←_← 这道题网络流还是可以写的... 既然限制了最多只能和 k 个不喜欢的人da ...

  7. bzoj 1305: [CQOI2009]dance 二分+網絡流判定

    1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1340  Solved: 581[Submit][Sta ...

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

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

  9. BZOJ-1305 dance跳舞 建图+最大流+二分判定

    跟随YveH的脚步又做了道网络流...%%% 1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 2119 S ...

随机推荐

  1. Cannot execute as the database principal because the principal "guest" does not exist, this type of principal cannot be impersonated, or you do not have permission.

    今天遇到这样一个问题:一个系统的作业需要给系统Support人员开放SQL Agent下作业的查看.执行权限.数据库版本为SQL Server 2014 SP2,给这个系统Support人员的NT账号 ...

  2. Linq专题之提高编码效率—— 第二篇 神一样的匿名类型

    说起匿名类型,我们都知道这玩意都是为linq而生,而且匿名类型给我们带来的便利性大家在实战中应该都体会到了,特别适合于一次性使用,临时 使用这些场景,虽然说是匿名类型,也就是说是有类型的,只是匿名了而 ...

  3. AsyncTask官方学习

    异步任务学习 这两天使用到特别多的AsyncTask类,一块来学习一下吧 AsyncTask允许更方便和简单使用UI线程,这个类允许你在UI线程中进行后台操作和展示结果,而无需操作Thread或者ha ...

  4. 关于oracle中数据类型的选择

    由于是初学,犯了如下错误: 生成表的主键id时,用当前时间的毫秒值.而在oracle中定义主键id时,用的数据类型是char(32).在mybatis中通过id取数据怎么也取不出来.想了好几天,本来以 ...

  5. EF高级应用

    UpdateSourceTrigger     NumberTextbox         参考 Finally! Entity Framework working in fully disconne ...

  6. MMORPG大型游戏设计与开发(服务器 游戏场景 聊天管道和寻路器)

    又快到双十一,又是不少同仁们出血的日子,首先希望大家玩的开心.我曾经想要仔细的剖析场景的的每个组件,就像这里的聊天管道与寻路器,但是仔细阅读别人代码的时候才发现元件虽小但是实现并不简单,因为有些东西还 ...

  7. 数-模(D/A)转换器

    将实现数字信号到模拟信号的转换电流称为数模(D/A)转换器,简称为DAC(Digital - Analog Convert). 目前常见的D/A转化器中,有:权电阻网络D/A转换器.倒T型电阻网络D/ ...

  8. POJ 1325 Machine Schedule——S.B.S.

    Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13731   Accepted: 5873 ...

  9. hdu 5652 India and China Origins 并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题目大意:n*m的矩阵上,0为平原,1为山.q个询问,第i个询问给定坐标xi,yi,表示i年后这 ...

  10. golang中的slice翻转存在以及map中的key判断

    //slice翻转 func stringReverse(src []string){ if src == nil { panic(fmt.Errorf("the src can't be ...