BZOJ-1305 dance跳舞 建图+最大流+二分判定
跟随YveH的脚步又做了道网络流。。。%%%
1305: [CQOI2009]dance跳舞
Time Limit: 5 Sec Memory Limit: 162 MB
Submit: 2119 Solved: 878
[Submit][Status][Discuss]
Description
一次舞会有n个男孩和n个女孩。每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞。每个男孩都不会和同一个女孩跳两首(或更多)舞曲。有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”)。每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞。给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲?
Input
第一行包含两个整数n和k。以下n行每行包含n个字符,其中第i行第j个字符为’Y’当且仅当男孩i和女孩j相互喜欢。
Output
仅一个数,即舞曲数目的最大值。
Sample Input
3 0
YYY
YYY
YYY
Sample Output
3
HINT
N<=50 K<=30
Source
加强数据By dwellings and liyizhen2
这道题,网上有说可以贪心的,然而似乎被证明是错误的了,(反正我也想不出贪心策略)
说一下建图:(建图有点麻烦,多谢恒妹的查错)
每个男孩建立两个次节点,每个女孩建立两个次节点,分别处理喜欢的和不喜欢的
超级源S向所有男生主节点连边,所有女生向超级汇连边,边权为二分枚举出来的值
男生主节点和处理喜欢的男生次节点连边边权为INF,向处理不喜欢的男生连边边权为k
女生处理喜欢的次节点向主节点连边,边权INF;处理不喜欢的次节点与主节点相连边权为k
相互喜欢的男生女生的喜欢节点相连边权为1,相互不喜欢的连边,边权为1
二分答案,及超级源指向男生主节点的边权(女生主节点指向超级汇的边权)
每次二分出答案重新建图,跑一边Dinic判断是否满流,最后输出二分出边权即可。
(这道题目不错不错)
(一开始没写二分写了个枚举,结果卡常了。。。“竟然被卡常了,666啊”—by YveH)
code:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int q[3000],h,t;
struct data{
int to,next,v;
}edge[1000001];
int cnt;
int head[3000]={0};
int dis[3000]={0};
int xh[51][51];
int n,k,num;
void add(int u,int v,int w)
{
cnt++;
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
edge[cnt].v=w;
}
void init()
{
scanf("%d%d",&n,&k);
for (int i=1; i<=n; i++)
{
char x[51];
scanf("%s",&x);
for (int j=1; j<=n; j++)
if (x[j-1]=='Y')
xh[i][j]=1;
}
}
void make(int v)
{
//男生i的主点序号为 in 则处理喜欢的次点序号为in+1,处理不喜欢的次点序号为in+2
//女生同理,接男生后面排
//超级源的序号0,超级汇为2*n*3+1
cnt=1; memset(head,0,sizeof(head));
num=1;
for (int i=1; i<=n; i++)
{
add(0,num,v);add(num,0,0);
num++;
add(num-1,num,0x7fffffff);add(num,num-1,0);
num++;
add(num-2,num,k);add(num,num-2,0);
num++;
}
for (int i=1; i<=n; i++)
{
add(num,2*n*3+1,v);add(2*n*3+1,num,0);
num++;
add(num,num-1,0x7fffffff);add(num-1,num,0);
num++;
add(num,num-2,k);add(num-2,num,0);
num++;
}
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
{
if (xh[i][j]==1)
{
add(i*3-2+1,3*n+j*3-2+1,1);
add(3*n+j*3-2+1,i*3-2+1,0);
}
else
{
add(i*3-2+2,3*n+j*3-2+2,1);
add(3*n+j*3-2+2,i*3-2+2,0);
}
}
}
}
bool bfs()
{
memset(dis,-1,sizeof(dis));
q[1]=0; dis[0]=1;
h=0; t=1;
while (h<t)
{
int j=q[++h],i=head[j];
while (i)
{
if (edge[i].v>0 && dis[edge[i].to]<0)
{
dis[edge[i].to]=dis[j]+1;
q[++t]=edge[i].to;
}
i=edge[i].next;
}
}
if (dis[num]>0)
return true;
else
return false;
}
int dfs(int loc,int low)
{
int now=0;
if (loc==num) return low;
int i=head[loc];
while (i)
{
if (edge[i].v>0 && dis[edge[i].to]==dis[loc]+1 && (now=dfs(edge[i].to,min(edge[i].v,low))))
{
edge[i].v-=now;
edge[i^1].v+=now;
return now;
}
i=edge[i].next;
}
return 0;
}
int main()
{
init();
int ans;
int flow;
int l=0,r=50;
while (l<=r)
{
int mid=(l+r)>>1;
make(mid);
flow=0;
while (bfs())
{
int now=0;
while ((now=dfs(0,0x7fffffff)))
flow+=now;
}
if (mid*n<=flow)
{l=mid+1;ans=mid;}
else
r=mid-1;
}//二分判断是否满流
printf("%d",ans);
return 0;
}
BZOJ-1305 dance跳舞 建图+最大流+二分判定的更多相关文章
- BZOJ 1305 dance跳舞 二分+最大流
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1305 题目大意: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成 ...
- bzoj 1305 dance跳舞
最大流. 首先二分答案,问题转化为x首舞曲是否可行. 考虑建图,对每个人建立三个点,分别表示全体,喜欢和不喜欢. 源点向每个男生全体点连一条容量为x的边. 每个男生整体点向喜欢点连一条容量为正无穷的边 ...
- BZOJ 1305 dance跳舞(最大流+二分答案)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1305 解题思路:转自:https://blog.csdn.net/u012288458/ ...
- BZOJ 1305--[CQOI2009]dance跳舞(最大流)
1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4150 Solved: 1792[Submit][St ...
- 志愿者招募 HYSBZ - 1061(公式建图费用流)
转自神犇:https://www.cnblogs.com/jianglangcaijin/p/3799759.html 题意:申奥成功后,布布经过不懈努力,终于 成为奥组委下属公司人力资源部门的主管. ...
- 2018.09.27 codeforces1045A. Last chance(线段树优化建图+最大流)
传送门 看完题应该都知道是网络流了吧. 但是第二种武器直接建图会gg. 因此我们用线段树优化建图. 具体操作就是,对于这m个人先建一棵线段树,父亲向儿子连容量为inf的边,最后叶子结点向对应的人连容量 ...
- 洛谷 P5331 - [SNOI2019]通信(CDQ 分治优化建图+费用流)
题面传送门 首先熟悉网络流的同学应该能一眼看出此题的建模方法: 将每个点拆成两个点 \(in_i,out_i\),连一条 \(S\to in_i\),容量为 \(1\) 费用为 \(0\) 的边 连一 ...
- 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流
1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 388 Solved: 212[Submit ...
- BZOJ 4242 水壶(BFS建图+最小生成树+树上倍增)
题意 JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有P个,编号为1...P. JOI君只能进入建筑 ...
随机推荐
- Android开发环境搭建(转)
转载:http://www.cnblogs.com/zoupeiyang/p/4034517.html#1 引言 在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想 ...
- fastDFS 一二事 - 简易服务器搭建(单linux)
什么是FastDFS FastDFS是一个叫余庆的哥们用c语言编写的一款开源的分布式文件系统 功能有冗余备份.负载均衡.线性扩容等,高可用.高性能 可以用FastDFS搭建一套高性能的文件服务器集群提 ...
- eclipse luna maven失效的原因
昨天发现单位里的eclipse中的maven直接不显示了,不能在 Windows-Preference 中显示maven 也不能新建maven工程,也不能maven-update,连STS(Sprin ...
- C++ 箭头-> 双冒号:: 点号.操作符区别
点 (.) 如果变量是一个对象或者对象引用,则用它来访问对象成员. 箭头( ->) 如果变量是一个对象指针,则用它来访问对象成员. 双冒号 (::) 如果操作目标是一个具有名空间的标识符,则用它 ...
- Yii提供的Htmler助手checkboxList可自定义Checkbox输出格式
foreach($catetags as $cate){ echo Html::checkboxList('category_id','',$cate,['item'=>'customCheck ...
- javascript边角知识
1.组织默认事件 阻止默认事件,h5默认的input type='date'在某些浏览器和android设备上没有效果,这时要调用h5+的时间选择器,但是要组织input默认的click事件,代码如下 ...
- 【转】WCF与Web API 区别(应用场景)
Web api 主要功能: 支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, update, delete)操作 请求的回 ...
- Verilog学习笔记基本语法篇(九)········ 任务和函数
task 和 function 说明语句分别用来定义任务和函数,利用任务和函数可以把函数模块分成许多小的任务和函数便于理解和调试.任务和函数往往还是大的程序模块在不同地点多次用到的相同的程序段.输入. ...
- [应用层]mail邮件协议
转:http://***/chapter-14/ 以前老记不住这smtp和pop3谁收谁发. 简单邮件传输协议(SMTP),用来发送或中转发出的电子邮件,占用tcp 25端口. 第三版邮局协议(POP ...
- [C#]動態叫用Web Service
http://www.dotblogs.com.tw/jimmyyu/archive/2009/04/22/8139.aspx 摘要 Web Service對大家來說想必都不陌生,也大都了解Web S ...