[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对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
随机推荐
- 如何用JavaScript做一个可拖动的div层
可拖动的层在Web设计中用处很多,比如在某些需要自定义风格布局的应用中,控件就需要拖动操作,下面介绍一个,希望可以满足你的需求,顺便学习一下可拖动的层是如何实现的. 下面是效果演示: 这个DIV可以移 ...
- VC++使用CImage在内存中Jpeg转换Bmp图片
VC++中Jpeg与Bmp图片格式互转应该是会经常遇到,Jpeg相比Bmp在图片大小上有很大优势. 本文重点介绍使用现有的CImage类在内存中进行转换,不需要保存为文件,也不需要引入第三方库. Li ...
- ShareSDK入门指南:Android 10分钟快速集成
ShareSDK 官方已提供Android 快速集成教程,以官方教程为参考,本文重点指导大家在集成中遇到的问题. Android 快速集成官方教程:http://wiki.mob.com/Androi ...
- xiaoluo同志Linux学习之CentOS6.4
小罗同志写的不错,弄个列表过来啊 Linux学习之CentOS(三十六)--FTP服务原理及vsfptd的安装.配置 xiaoluo501395377 2013-06-09 01:04 阅读:56 ...
- webkit在vs2008中编译
转载自:http://xjchilli.blog.163.com/blog/static/4534773920091016115533158/ webkit的官方网站写的webkit需要在vs2005 ...
- 关于跨域策略文件crossdomain.xml文件--配置实例
转载自:http://bbs.phpchina.com/blog-52440-191623.html 我一直不太明白crossdomain.xml文件是干嘛用的,今天总算比较清楚的知道了一下. 这是F ...
- jw player学习笔记
一.是否支持IE7/8 本地离线播放不支持IE7/8,部署在服务器上时可以. 本地播放报错示意图 二.如何去Logo 1.网页版--HTML5---破解 桌面浏览器看到的效果: jwplayer(&q ...
- Hibernate 懒加载 错误----no session
错误: unable to evaluate the expression Method threw 'org.hibernate.LazyInitializa org.hibernate.LazyI ...
- 常见的makefile写法【转】
转自:http://blog.csdn.net/ghostyu/article/details/7755177 版权声明:本文为博主原创文章,未经博主允许不得转载. .目标名称,摆脱手动设置目标名称 ...
- C++类学习
一.C++类的定义 C++中使用关键字 class 来定义类, 其基本形式如下:class 类名{ public: //行为或属性 protected: //行为或属性 private: / ...