[BZOJ 1305] 跳舞
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1305
Solution:
发现res是否可行具有单调性,二分答案
容易看出每次check(mid)用网络流判断,关键在于建图:
1)将每一个人拆成两个点,男孩的两个点为X1,X2,女孩为Y1,Y2
2)将相互喜欢的将X1,Y1相连,互相讨厌的将X2,Y2相连,容量为1
3)每一个X1向X2连一条容量为k的边,每一个Y2向Y1连一条容量为k的边
4)从源点向每一个X1连容量mid的边,从每一个Y1向汇点连容量为mid的边
这里建图的难点还是在拆点上,
拆点的目的在于将从该点出发的流量分类,并能对每一类进行容量限制:
EX:为了使向“讨厌的”流量不超过k,我们将Xi流向“讨厌的”节点的流量专门设一个源点(分类)
这样将 Xi1 ----> Xi2 的容量设为k即可满足这一条件(加以容量限制)
于是当遇到每个点根据不同流向的流量要加以不同限制时,
考虑将点拆成好几个,再对每个点建一个总源点(此题没有必要,只有2类)
Code:
#include <bits/stdc++.h> using namespace std; const int MAXN=+;
const int INF=<<; struct edge
{
int to,cap,rev;
};
vector<edge> G[MAXN]; char dat[MAXN][MAXN];
int n,k,S,T,level[MAXN],iter[MAXN]; void add_edge(int from,int to,int cap)
{
G[from].push_back(edge{to,cap,G[to].size()});
G[to].push_back(edge{from,,G[from].size()-});
} bool bfs()
{
memset(level,-,sizeof(level));
queue<int> que;que.push(S);level[S]=; while(!que.empty())
{
int u=que.front();que.pop();
for(int i=;i<G[u].size();i++)
{
edge v=G[u][i];
if(v.cap && level[v.to]==-)
level[v.to]=level[u]+,que.push(v.to);
}
}
return level[T]!=-;
} int dfs(int v,int f)
{
if(v==T) return f;
int ret=;
for(int& i=iter[v];i<G[v].size();i++)
{
edge &e=G[v][i];
if(e.cap && level[e.to]==level[v]+)
{
int d=dfs(e.to,min(f,e.cap));
e.cap-=d;G[e.to][e.rev].cap+=d;ret+=d;f-=d; //一定要加f-=d
if(!f) break; //这里的剪枝很重要
}
}
return ret;
} int dinic()
{
int ret=;
while(bfs())
memset(iter,,sizeof(iter)),ret+=dfs(S,INF);
return ret;
} void build(int flow)
{
for(int i=;i<MAXN;i++) G[i].clear();
for(int i=;i<=n;i++) add_edge(S,i,flow),add_edge(i,i+*n,k);
for(int i=n+;i<=*n;i++) add_edge(i,T,flow),add_edge(i+*n,i,k);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(dat[i][j]=='Y') add_edge(i,n+j,);
else add_edge(i+*n,n+j+*n,);
} int main()
{
scanf("%d%d",&n,&k);
S=;T=*n+;
for(int i=;i<=n;i++) scanf("%s",dat[i]+); int l=,r=; //从0开始二分
while(l<=r)
{
int mid=(l+r)>>;
build(mid);
if(dinic()<n*mid) r=mid-;
else l=mid+;
}
printf("%d",r);
return ;
}
Review:
关于Dinic的两种模板:
(1)找到一条路径便立即返回
(2)对于每个点枚举完所有情况后一起返回
由于Dinic能加上当前弧优化,所以(1)虽然开栈次数看上去多了,但效率绝对不比(2)差
而(2)如果不加上容量已为0时的剪枝,则要比(1)慢得多
注意:使用(2)时每次一定要f-=d
[BZOJ 1305] 跳舞的更多相关文章
- BZOJ 1305 跳舞(二分+网络流)
无法直接构造最大流来解决这个问题,因为题目要求每首舞曲都需要n对男女进行跳舞. 答案又满足单调性,这启发我们二分答案,判断是否满流验证答案. 假设舞曲数目为x时满足条件,那么每个男生和女生都需要跳x次 ...
- bzoj 1305: [CQOI2009]dance跳舞
题目链接 bzoj 1305: [CQOI2009]dance跳舞 题解 男,女生拆点A1A2,B1B2,拆成两点间分别连容量为K的边,限制与不喜欢的人跳舞的数量 A1连接源点容量为x,B1连接汇点容 ...
- BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流
1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...
- BZOJ 1305: [CQOI2009]dance跳舞( 最大流 )
云神代码很短...0 ms过的...看了代码 , 大概是贪心... orz 我不会证 数据这么小乱搞就可以了吧... ←_← 这道题网络流还是可以写的... 既然限制了最多只能和 k 个不喜欢的人da ...
- BZOJ 1305 dance跳舞 二分+最大流
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1305 题目大意: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成 ...
- BZOJ 1305 [CQOI2009]dance跳舞(二分+网络流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1305 [题目大意] 一次舞会有n个男孩和n个女孩. 每首曲子开始时,所有男孩和女孩恰好 ...
- BZOJ 1305 dance跳舞(最大流+二分答案)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1305 解题思路:转自:https://blog.csdn.net/u012288458/ ...
- BZOJ 1305:dance跳舞(二分+最大流)
一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”).每个男孩 ...
- BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
随机推荐
- 【BZOJ4325】NOIP2015 斗地主 搜索+贪心
这个东西考试的时候一眼以为状压就压炸了考试又了一下午.....最后我打出来发现后几个点10min都过不去,我大概算了一下,可能是吧.......最后一脸懵逼的我去怂了正解,我们发现只要确定了顺子就可以 ...
- 从零开始学习MXnet(五)MXnet的黑科技之显存节省大法
写完发现名字有点拗口..- -# 大家在做deep learning的时候,应该都遇到过显存不够用,然后不得不去痛苦的减去batchszie,或者砍自己的网络结构呢? 最后跑出来的效果不尽如人意,总觉 ...
- 纯手工 CheckboxTree 实现
数据结构及页面显示格式: INSERT INTO AS_CombRules VALUES('', '', '', '', '', '', '') 实现 CheckboxTree 功能: html代码: ...
- linux下输出tomcat控制台信息
进入tomcat/logs/目录执行命令:tail -f catalina.out即可
- 转:mybatis 高级结果映射(http://blog.csdn.net/ilovejava_2010/article/details/8180521)
高级结果映射 MyBatis的创建基于这样一个思想:数据库并不是您想怎样就怎样的.虽然我们希望所有的数据库遵守第三范式或BCNF(修正的第三范式),但它们不是.如果有一个数据库能够完美映射到所有应用程 ...
- HDU5748---(记录每个元素的 最长上升子序列 nlogn)
分析: 给一个序列,求出每个位置结尾的最长上升子序列 O(n^2) 超时 #include "cstdio" #include "algorithm" #def ...
- ILSPY反编译工具下载代替收费的Reflector工具
原文发布时间为:2011-10-10 -- 来源于本人的百度文章 [由搬家工具导入] ILSPY反编译工具下载 http://build.sharpdevelop.net/BuildArtefacts ...
- [bzoj1251]序列终结者——splay
题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...
- 4.shell预定义变量
就是shell设计者实现预定好的变量,可以直接在shell脚本中使用$$:当前进程的进程号(pid)$!:后台运行的最后一个进程的进程号(pid)$?:最后一次执行的命令的返回状态,如果这个变量的值为 ...
- 【 Keepalived 】Nginx or Http 主-备模式
一.主-备模式: 操作系统:centos 6.4 x64 ka1: 192.168.2.10 ka2: 192.168.2.11 vip: 192.168.2.200 ka1-master服务器配置 ...