题面见 https://www.luogu.org/problemnew/show/P3153

题意简述:有n个男生,n个女生,每一首歌时两位男女配对,然后同一对男女只能跳一场,一个人只会与不喜欢的人跳k场,求最大可以满员跳几场

这个题目看完可以猜测到这道题需要二分答案进行check()

然后就是建图,首先在check的时候查看是否所有边都流满了,其次因为一对男女跳一场,所以建边容量为1,然后男生和女生分别向原点和汇点连容量为mid的边

最后就是如何实现与不喜欢的人跳k场,根据网络流的常规操作,拆个点就很不错,这个时候可以选择这样拆点把一个人拆成两个分点,一个总点,一个总点代表有mid流量进来,两个分点分别和喜欢还有不喜欢的人相连,总点向不喜欢的人连k容量,向喜欢的连mid容量,然后分点分别与喜欢和不喜欢相连

(我最后改成了把喜欢的分点合并到总点里面去)

然后就是代码了

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
inline int read(){
int w=,f=;
char ch=getchar();
while(ch<''||ch>''){
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
w=(w<<)+(w<<)+ch-;
ch=getchar();
}
return w*f;
}
int n,m,cur[],head[],cnt=,depth[],maxflow,S,T;
bool debug;
const int p=;
struct Edge{
int from,to,flow,dis,next;
}edge[];
queue<int> q;
inline void addedge(int u,int v,int w){
cnt++;
edge[cnt].from=u;
edge[cnt].to=v;
edge[cnt].flow=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
inline void ins(int u,int v,int w){
addedge(u,v,w);addedge(v,u,);
}
int mapp[][];
inline bool bfs(int st,int ed){
memset(depth,,sizeof(depth));int i,j,k;
for(i=;i<=;i++) cur[i]=head[i];
depth[st]=;q.push(st);
while(!q.empty()){
int u=q.front();q.pop();
for(i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(!depth[v]&&edge[i].flow){
q.push(v);depth[v]=depth[u]+;
}
}
}
return depth[ed];
}
inline int dfs(int u,int ed,int limit){
if(u==ed||!limit) return limit;
int f,i,j,k;int flow=;
for(i=cur[u];i;i=edge[i].next){
cur[u]=i;int v=edge[i].to;
if(depth[v]==depth[u]+&&(f=dfs(v,ed,min(limit,edge[i].flow)))){
limit-=f;flow+=f;
edge[i].flow-=f;edge[i^].flow+=f;
if(!limit) break;
}
}
return flow;
}
inline void Dinic(){
while(bfs(S,T)){
//cout<<"fuck1"<<endl;
maxflow+=dfs(S,T,INF);
}
}
inline bool check(int a){
S=;T=;int i,j,k;cnt=;maxflow=;
memset(head,,sizeof(head));
for(i=;i<=n;i++){
ins(S,i,a);
ins(i,i+n,m);
ins(i+*n,i+*n,m);
ins(i+*n,T,a);
}
for(i=;i<=n;i++){
for(j=;j<=n;j++){
if(mapp[i][j]) ins(i,j+*n,);
else ins(i+n,j+*n,);
}
}
Dinic();
//cout<<a<<" "<<maxflow<<endl;
if(maxflow==a*n) return true;
else return false;
}
int main(){
n=read();m=read();int i,j,k;
for(i=;i<=n;i++){
for(j=;j<=n;j++){
char ch;cin>>ch;
if(ch=='Y') mapp[i][j]=;
else mapp[i][j]=;
}
}
int l=,r=n+m;int ans;
while(l<=r){
int mid=(l+r)>>;
//cout<<mid<<" "<<check(mid)<<endl;
if(check(mid)) l=mid+,ans=mid;
else r=mid-;
}
cout<<ans<<endl;
return ;
}

CQOI跳舞(网络流+二分答案)的更多相关文章

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

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

  2. BZOJ 3993 [SDOI2015]星际战争 | 网络流 二分答案

    链接 BZOJ 3993 题解 这道题挺棵的-- 二分答案t,然后源点向武器连t * b[i], 武器向能攻击的敌人连1, 敌人向汇点连a[i],如果最大流等于所有敌人的a[i]之和则可行. #inc ...

  3. BZOJ 2406: 矩阵 [上下界网络流 二分答案]

    2406: 矩阵 题意:自己去看吧,最小化每行每列所有元素与给定矩阵差的和的绝对值中的最大值 又带绝对值又带max不方便直接求 显然可以二分这个最大值 然后判定问题,给定矩阵每行每列的范围和每个元素的 ...

  4. BZOJ 1733: [Usaco2005 feb]Secret Milking Machine 神秘的挤奶机 网络流 + 二分答案

    Description Farmer John is constructing a new milking machine and wishes to keep it secret as long a ...

  5. poj2112 网络流+二分答案

    Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 18083   Accepted: 6460 ...

  6. 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)

    洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...

  7. 【BZOJ3993】星际战争(网络流,二分答案)

    [BZOJ3993]星际战争(网络流,二分答案) 题面 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团 ...

  8. 【BZOJ5251】【八省联考2018】劈配(网络流,二分答案)

    [BZOJ5251][八省联考2018]劈配(网络流,二分答案) 题面 洛谷 BZOJ Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序 ...

  9. 【BZOJ1305】dance跳舞(最大流,裂点,二分答案)

    题意:一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲. 有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”). ...

随机推荐

  1. shell 颜色输出

    #!/bin/bash function display_method(){ clearDisplayMetho=0 if [ $displayMethod -eq 0 ]; then echo -e ...

  2. C#调用Windows API(示例:显示任务管理器里的程序名称)

    作为初学者来说,在C#中使用API确是一件令人头疼的问题. 在使用API之前你必须知道如何在C#中使用结构.类型转换.安全/不安全代码,可控/不可控代码等许多知识. 在.Net Framework S ...

  3. symfonos2

    0x01 进入网页 啥也没有 0x02 目录爆破 啥也没有 0x03 端口扫描 知识盲区: ProFTPD 1.3.5 用ProFTPD服务权限执行复制命令,默认在'nobody'用户的特权下运行.通 ...

  4. MySQL必知必会--汇 总 数 据

    聚集函数 我们经常需要汇总数据而不用把它们实际检索出来,为此MySQL提 供了专门的函数.使用这些函数,MySQL查询可用于检索数据,以便分 析和报表生成.这种类型的检索例子有以下几种. 确定表中行数 ...

  5. abp集成IdentityServer4和单点登录

    在abp开发的系统后,需要使用这个系统作单点登录,及其他项目登录账号依靠abp开发的系统.在官方文档上只找到作为登录服务Identity Server Integration,但是host项目却无法使 ...

  6. java 企业 网站源码 模版 屏幕自适应 有前后台 springmvc SSM 生成静态化

    前台: 支持四套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问 ...

  7. 通过sql的stuff 把一列几行的记录拼接在一行一个字段

    ---通过sql的stuff 把一列几行的记录拼接在一行一个字段 select FID,a.FCustomerID as 工地ID , 应验收节点 = (stuff((select ',' + isn ...

  8. 展讯平台uboot启动流程

    启动流程 1. Stage1 start.S代码结构 u-boot的stage1代码通常放在start.S文件中,用汇编语言,主要实现功能如下:  (1) 定义入口: 该工作通过修改连接器脚本来完成. ...

  9. iMacros 入门教程-基础函数介绍(4)

    imacros的TRAY函数用法 这个函数的功能就是隐藏或显示,当执行imacros文件的时候,出现在特定标签的imacros图标 TRAY HIDE 就是隐藏图标 TRAY SHOW 就是显示图标 ...

  10. go 算法与数据结构

    数据结构 稀疏数组 package main import "fmt" /* 稀疏数组 案例:五子棋存盘与复盘 节省存储空间 */ type ValNode struct { ro ...