看menci的博客点出二分的思路然后做出来,menci太强辣

原题:

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

N<=50 K<=30

看榜上的都是0MS,这是什么神奇的做法

先看menci的博客发现这道题,知道是网络流,想了一段时间无果,回menci的博客看了一眼,然后发现两个字

"二分"

然后思路就想出来了,二分答案,根据答案建图然后验证是否能跑到满流

具体建图方法就很简答了,相互喜欢的男女权值为1,每个男女要额外一个点来保证和不喜欢的人的限制,本来的点和额外的点中间权值为k,两个不喜欢的男女之间额外的点权值为1,源到男,女到汇权值为二分的答案

如果能跑到满流就说明答案和法

另外有一点需要注意就是二分的下线要从0开始,因为可能会无解

二分也是转换问题很关键的方式,以后想题还要尽量考虑一下

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
const int oo=;
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
struct ddd{int y,v,re;}; vector <ddd> e[];
inline void ist(int x,int y,int z){
e[x].push_back((ddd){y,z,e[y].size()});
e[y].push_back((ddd){x,,e[x].size()-});
}
int n,m; int s,t; int n2,n3,n4;
char a[][];
int lvl[];
int q[],hd=;
void clear(){ for(int i=s;i<=t;++i) e[i].clear();}
bool gtlvl(){
memset(lvl,,sizeof(lvl));
q[hd=]=s,lvl[s]=;
int x,sz;
for(int k=;k<=hd;++k){
x=q[k],sz=e[x].size();
for(int i=;i<sz;++i)if(e[x][i].v && !lvl[e[x][i].y])
lvl[e[x][i].y]=lvl[x]+,q[++hd]=e[x][i].y;
}
return lvl[t];
}
int agmt(int x,int y){
if(x==t) return y;
int mxflw=,flw,sz=e[x].size();
for(int i=;i<sz && mxflw<y;++i)if(lvl[e[x][i].y]==lvl[x]+ && e[x][i].v)
if(flw=agmt(e[x][i].y,min(y-mxflw,e[x][i].v))){
mxflw+=flw;
e[x][i].v-=flw,e[e[x][i].y][e[x][i].re].v+=flw;
}
if(!mxflw) lvl[x]=;
return mxflw;
}
int dnc(){
int bwl=,flw;
while(gtlvl())while(flw=agmt(s,oo)) bwl+=flw;
return bwl;
}
bool chck(int x){
clear();
for(int i=;i<=n;++i){
for(int j=;j<=n;++j){
if(a[i][j]=='Y') ist(i,j+n3,);
else ist(i+n,j+n2,);
}
ist(i,i+n,m),ist(i+n2,i+n3,m);
ist(s,i,x),ist(i+n3,t,x);
}
return dnc()==x*n;
}
int bnrsch(){
int l=,r=n,md;
while(l+<r){ md=(l+r)>>; (chck(md)?l:r)=md;}
return chck(r)?r:l;
}
int main(){//freopen("ddd.in","r",stdin);
cin>>n>>m; n2=n*,n3=n*,n4=n*; s=,t=n4+;
/*for(int i=1;i<=n;++i){
scanf("%s",s+1);
for(int j=1;j<=n;++j){
if(s[j]=='Y') ist(i,j+3n,1);
else ist(i+n,j+2n,1);
}
ist(i,i+n,k),ist(i+2n,i+3n,k);*/
for(int i=;i<=n;++i) scanf("%s",a[i]+);
cout<<bnrsch()<<endl;
return ;
}

【BZOJ1305】【CQOI2009】 dance跳舞的更多相关文章

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

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

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

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

  3. bzoj1305: [CQOI2009]dance跳舞(二分答案+网络流)

    1305: [CQOI2009]dance跳舞 题目:传送门 题解: 一眼网络流基础建模...然后就GG了 二分答案+拆点建边+最大流判断: 把男女生拆为男1,男2,女1,女2 1.男1和男2还有女1 ...

  4. Bzoj1305 [CQOI2009]dance跳舞

    Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 2925  Solved: 1221 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时 ...

  5. 【二分答案】【最大流】bzoj1305 [CQOI2009]dance跳舞

    http://hzwer.com/1986.html #include<cstdio> #include<algorithm> #include<queue> #i ...

  6. 并不对劲的bzoj1305: [CQOI2009]dance跳舞

    传送门-> 又是陈年老坑. 听上去不知道从何下[手]?那要是把题目换成“判断这些人能否条x支舞”呢? 这样就变成了一个网络流可以解决的问题,只要把每个人拆成喜欢和不喜欢两点,每个人两点总流量不超 ...

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

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

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

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

  9. AC日记——[CQOI2009]DANCE跳舞 洛谷 P3153

    [CQOI2009]DANCE跳舞 思路: 二分+最大流: 代码: #include <cstdio> #include <cstring> #include <iost ...

  10. bzoj 1305: [CQOI2009]dance跳舞

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

随机推荐

  1. vs2015 产品密钥

    一.破解秘钥 企业版    HM6NR-QXX7C-DFW2Y-8B82K-WTYJV 专业版    HMGNV-WCYXV-X7G9W-YCX63-B98R2 二.破解步骤 1.安装vs2015 2 ...

  2. PHP和Mysql事物处理

    这几天做支付的时候,又用到了事物,为了方便自己以后查看,今天闲的没事就把以前的东西整理下.(其中引用别人的东西,在这里谢谢他们贡献的代码!) 一.事务处理概述: 事务:是若干事件的集合 事务处理:当所 ...

  3. [Linux]Linux下修改snmp协议的默认161端口

    一.Linux SNMP的配置 SNMP的简介和Linux下IPV4,IPV6地址的snmp协议开启可以参考上一个随笔:[Linux]CentOS6.9开启snmp支持IPV4和IPV6 二.修改默认 ...

  4. 深入理解java虚拟机----java技术体系(一)

    1.java技术体系 举例: class文件格式:如下图所示,java源代码可以根据不同的编译器可以编译成不同的代码.即可以自定义语言规范比如beanshell,并编写代码; 然后自己编写java编译 ...

  5. 打开和写入excel文件

    一.使用win32读取excel内容 # -*- coding: utf-8 -*- from win32com import client as wc def open_excel(): excel ...

  6. B2C B2B C2C O2O模式的介绍

                    b2c:天猫 商家对客户                 c2c:淘宝 客户到客户(卖家也是阿里公司的客户)                 o2o:美团 线上花费,下 ...

  7. kettle在linux下执行任务

    1.下载 最新版下载 7.1 https://community.hitachivantara.com/docs/DOC-1009855 准备 上传任务文件 .kjb,.ktr 上传mysql 驱动 ...

  8. L267 How to save money

    When it comes to saving money, the struggle is all too real. It's like your bank account and your 20 ...

  9. Linux:配置samba服务

    配置samba服务  一.简略教程 1.挂载系统 mount /dev/cdrom /mnt/cdrom2.创建用户:useradd linlin3.创建用户密码:passwd linlin4.在用户 ...

  10. JQ 设置控件显示 隐藏

    ("#id").css('display','none'); $("#id").css('display','block'); 或 $("#id&qu ...