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] 跳舞的更多相关文章

  1. BZOJ 1305 跳舞(二分+网络流)

    无法直接构造最大流来解决这个问题,因为题目要求每首舞曲都需要n对男女进行跳舞. 答案又满足单调性,这启发我们二分答案,判断是否满流验证答案. 假设舞曲数目为x时满足条件,那么每个男生和女生都需要跳x次 ...

  2. bzoj 1305: [CQOI2009]dance跳舞

    题目链接 bzoj 1305: [CQOI2009]dance跳舞 题解 男,女生拆点A1A2,B1B2,拆成两点间分别连容量为K的边,限制与不喜欢的人跳舞的数量 A1连接源点容量为x,B1连接汇点容 ...

  3. BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流

    1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...

  4. BZOJ 1305: [CQOI2009]dance跳舞( 最大流 )

    云神代码很短...0 ms过的...看了代码 , 大概是贪心... orz 我不会证 数据这么小乱搞就可以了吧... ←_← 这道题网络流还是可以写的... 既然限制了最多只能和 k 个不喜欢的人da ...

  5. BZOJ 1305 dance跳舞 二分+最大流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1305 题目大意: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成 ...

  6. BZOJ 1305 [CQOI2009]dance跳舞(二分+网络流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1305 [题目大意] 一次舞会有n个男孩和n个女孩. 每首曲子开始时,所有男孩和女孩恰好 ...

  7. BZOJ 1305 dance跳舞(最大流+二分答案)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1305 解题思路:转自:https://blog.csdn.net/u012288458/ ...

  8. BZOJ 1305:dance跳舞(二分+最大流)

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

  9. BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模

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

随机推荐

  1. 【BZOJ 2432】 [Noi2011]兔农 矩乘+数论

    这道题的暴力分还是很良心嘛~~~~~ 直接刚的话我发现本蒟蒻只会暴力,矩乘根本写不出来,然后让我们找一下规律,我们发现如果我们把这个序列在mod k的意义下摆出,并且在此过程中把值为1的的数减一,我们 ...

  2. HDU4370:0 or 1(最短路)

    0 or 1 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4370 Description: Given a n*n matrix Cij (1< ...

  3. webkit开发,app移动前端知识点

    1. viewport:也就是可视区域.对于桌面浏览器,我们都很清楚viewport是什么,就是出去了所有工具栏.状态栏.滚动条等等之后用于看网页的区域,这是真正有效的区域.由于移动设备屏幕宽度不同于 ...

  4. AWS nat monitor and route switch script

    This script will monitor another NAT instance and take over its routes if communication with the oth ...

  5. ACM-ICPC 2018 南京赛区网络预赛 Sum

    A square-free integer is an integer which is indivisible by any square number except 11. For example ...

  6. Codeforces 270E Flawed Flow 网络流问题

    题意:给出一些边,给出边的容量.让你为所有边确定一个方向使得流量最大. 题目不用求最大流, 而是求每条边的流向,这题是考察网络流的基本规律. 若某图有最大,则有与源点相连的边必然都是流出的,与汇点相连 ...

  7. c++文件流写入到execl中

    #include <iostream> #include <fstream> #include <string> using namespace std; int ...

  8. 关于测试url传值的问题

    url1:http://localhost:8080/fms/finan/isRiskCustomer.action?customername="xxxxxxxx"; 如上这样写, ...

  9. DRF最高封装的子类视图

    # 转载请留言联系 子类视图: 视图 作用 方法 父类 ListAPIView 查询多条数据 get GenericAPIView ListModelMixin CreateAPIView 新增一条数 ...

  10. vmware的3种网络模式

    ####图片以及部分内容来源:https://note.youdao.com/share/?id=236896997b6ffbaa8e0d92eacd13abbf&type=note#/ 在安 ...