看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. jdk8-stream的api

    1.stream流的概念 1.流的创建 //1. 创建 Stream @Test public void test1(){ //1. Collection 提供了两个方法 stream() 与 par ...

  2. bootstrap table 分页显示问题

    1.bootstrap-table客户端分页 客户端分页的数据源可以是后台服务器端传递过来(一次性获取,即获取所有你需要的数据),点击页码不再请求后台,利用页面缓存分页;cache : true, / ...

  3. SharePoint Framework 企业向导(二)

    博客地址:http://blog.csdn.net/FoxDave 开发者视角 SharePoint开发者,无论是新手还是有经验的,都可以从SPFx中获取一些东西.当前SPFx的发布版本专注于以一 ...

  4. L306 词汇题

    Public acceptance of rabbit as an economical source of protein depends on how aggressively producers ...

  5. L256 阅读理解

    1主旨题 2细节题 题干关键词 人名,地名,专有名词,时间,和主题相关的核心词汇,带特殊标点的词汇 干扰项 词意猜测

  6. 18-10-16 IE 快捷键的组合方式

    一般快捷键 F11打开/关闭全屏模式 TAB循环的选择地址栏,刷新键和当前标签页 CTRL+F在当前标签页查询字或短语 CTRL+N为当前标签页打开一个新窗口 CTRL+P打印当前标签页 CTRL+A ...

  7. mysql 优化2

    6. 合理使用EXISTS,NOT EXISTS子句.如下所示: 1.SELECT SUM(T1.C1) FROM T1 WHERE (SELECT COUNT(*)FROM T2 WHERE T2. ...

  8. Java学习笔记8(面向对象3:接口)

    接口的概念: 接口是功能的集合,同样可以看最做事一种数据类型,是比抽象类更为抽象的"类”. 接口之描述所应该具备的方法,并没有具体实现,具体的实现有接口的实现类(相当于接口的子类)来完成.这 ...

  9. flex 布局 出滚动条的操作

    flex布局也是可以初横向滚动条的哦, 设置 flex-wrap:nowrap ,然后横向的固定宽度超过100% 则出滚动条

  10. http --爬虫

    http模块可以创建服务器, var http=require('http'); var path=require('path'); var fs=require('fs'); http.get(ur ...