[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对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
随机推荐
- 【BZOJ 4832】 [Lydsy2017年4月月赛] 抵制克苏恩 期望概率dp
打记录的题打多了,忘了用开维记录信息了......我们用f[i][j][l][k]表示已经完成了i次攻击,随从3血剩j个,2血剩l个,1血剩k个,这样我们求出每个状态的概率,从而求出他们对答案的贡献并 ...
- JS中this的指向问题(读书笔记纯手打~)
一.this JavaScrip的this总是指向一个对象,而具体指向哪个对象是在运行时基于函数的执行环境动态绑定的,而非函数被声明时的环境. 二.this的指向 根据运用情景可分为四类: 1.作为对 ...
- AWS nat monitor and route switch script
This script will monitor another NAT instance and take over its routes if communication with the oth ...
- ICE学习笔记一----运行官方的java版demo程序
建议新手和我一样,从官网下载英文文档,开个有道词典,慢慢啃. 官方文档下载: http://download.csdn.net/detail/xiong_mao_1/6300631 程序代码就不说了, ...
- 动态规划:数位DP
数位dp一般应用于: 求出在给定区间[A,B]内,符合条件P(i)的数i的个数 条件P(i)一般与数的大小无关,而与 数的组成 有关 例题是一道BZOJ1833,让求出区间所有整数每个数字出现的次数 ...
- bzoj4886 [Lydsy2017年5月月赛]叠塔游戏
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4886 [题解] 跟bzoj4883:http://www.cnblogs.com/galax ...
- [POJ2187][BZOJ1069]旋转卡壳
旋转卡壳 到现在依然不确定要怎么读... 以最远点对问题为例,枚举凸包上的两个点是最简单的想法,时间复杂度O(n2) 我们想象用两条平行线卡着这个凸包,当其中一个向某个方向旋转的时候另一个显然也是朝同 ...
- [BZOJ1031][JSOI2007]字符加密Cipher 解题报告
Description 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作 ...
- Nginx的主要配置参数说明
#定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数.worker_processes 8; #全局错误日志定义类型,[ debug | in ...
- 关于Javascript 闭包的理解
一.什么是闭包? 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.相信很少有人能直接看懂这句话,因为他描述的太学术.其实这句话 ...