题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1305

解题思路:
转自:https://blog.csdn.net/u012288458/article/details/50709571

二分答案
每个点拆成两个点x,x'
每个男生x向x'连一条容量为k的边
每个女生y'向y连一条容量为k的边
源点S向每个男生连一条容量为ans的边
每个女生向汇点T连一条容量为ans的边
对于男生x和女生y,
如果互相喜欢,则x向y连一条容量为1的边
如果不互相喜欢,则x’向y'连一条容量为1的边
若最大流为n*ans则可行,否则不可行
点数4n+2
边数(4n+n^2)*2

代码:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<algorithm>
  6 #include<queue>
  7 #include<vector>
  8 #define LL long long
  9 #define pii pair<int,int>
 10 #define pll pair<long long,long long>
 11 #define rep(i,a,b) for(int i=a;i<=b;i++)
 12 #define per(i,a,b) for(int i=a;i>=b;i--)
 13 #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
 14 #define bug cout<<"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"<<endl;
 15 #define bugc(_) cout << (#_) << " = " << (_) << endl;
 16 using namespace std;
 17 const int N=5e2+5;
 18 const int M=5e3+5;
 19 const int INF=0x3f3f3f3f;
 20
 21 struct node{
 22     int to,next,flow;
 23 }edge[M*2];
 24
 25 int cnt,st,en,n,k;
 26 int head[N],dep[N],like[N][N];
 27
 28 void init(){
 29     cnt=2;
 30     memset(head,0,sizeof(head));
 31 }
 32
 33 void link(int u,int v,int flow){
 34     edge[cnt]=node{v,head[u],flow};
 35     head[u]=cnt++;
 36     edge[cnt]=node{u,head[v],0};
 37     head[v]=cnt++;
 38 }
 39
 40 int bfs(){
 41     memset(dep,0,sizeof(dep));
 42     dep[st]=1;
 43     queue<int>q;
 44     q.push(st);
 45     while(!q.empty()){
 46         int u=q.front();
 47         q.pop();
 48         for(int i=head[u];i;i=edge[i].next){
 49             node t=edge[i];
 50             if(t.flow&&!dep[t.to]){
 51                 dep[t.to]=dep[u]+1;
 52                 q.push(t.to);
 53             }
 54         }
 55     }
 56     return dep[en];
 57 }
 58
 59 int dfs(int u,int fl){
 60     if(u==en) return fl;
 61     for(int i=head[u];i;i=edge[i].next){
 62         node &t=edge[i];
 63         if(t.flow&&dep[u]+1==dep[t.to]){
 64             int x=dfs(t.to,min(t.flow,fl));
 65             if(x>0){
 66                 t.flow-=x;
 67                 edge[i^1].flow+=x;
 68                 return x;
 69             }
 70         }
 71     }
 72     dep[u]=-2;
 73     return 0;
 74 }
 75
 76 int dinic(){
 77     int ans=0;
 78     while(bfs()){
 79         while(int d=dfs(st,INF)){
 80             ans+=d;
 81         }
 82     }
 83     return ans;
 84 }
 85
 86 void build(int mid){
 87     init();
 88     for(int i=1;i<=n;i++){
 89         link(st,i,mid);
 90         link(i,i+n,k);
 91         link(i+2*n,en,mid);
 92         link(i+3*n,i+2*n,k);
 93     }
 94     for(int i=1;i<=n;i++){
 95         for(int j=1;j<=n;j++){
 96             if(like[i][j])
 97                 link(i,j+2*n,1);
 98             else
 99                 link(i+n,j+3*n,1);
100         }
101     }
102 }
103
104 int main(){
105     while(~scanf("%d%d",&n,&k)){
106         for(int i=1;i<=n;i++){
107             char tmp[100];
108             scanf("%s",tmp+1);
109             for(int j=1;j<=n;j++){
110                 if(tmp[j]=='Y')
111                     like[i][j]=1;
112             }
113         }
114         st=0,en=4*n+1;
115         int l=0,r=n,ans=-1;
116         while(l<=r){
117             int mid=(l+r)/2;
118             build(mid);
119             int sum=dinic();
120             if(sum>=n*mid){
121                 ans=mid;
122                 l=mid+1;
123             }
124             else
125                 r=mid-1;
126         }
127         printf("%d\n",ans);
128     }
129     return 0;
130 }

转载于:https://www.cnblogs.com/fu3638/p/9880040.html

BZOJ 1305 dance跳舞(最大流+二分答案)相关推荐

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

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

  2. BZOJ2406矩阵——有上下界的可行流+二分答案

    题目描述 输入 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. 输出 第一行,输出最小的答案: 样例输入 2 2 0 1 2 1 0 1 样例输出 1 ...

  3. bzoj 1614 Telephone Lines架设电话线 - 二分答案 - 最短路

    Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...

  4. Bzoj 3343: 教主的魔法(分块+二分答案)

    3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...

  5. bzoj1305【CQOI2009】dance 跳舞

    1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec   Memory Limit: 162 MB Submit: 2041   Solved: 853 [ Submit ...

  6. 【BZOJ 1305】 [CQOI2009]dance跳舞

    1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec   Memory Limit: 162 MB Submit: 1586   Solved: 666 [ Submit ...

  7. BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)

    字符串终于告一段落了! 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3993 (luogu) https://www.l ...

  8. BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )

    一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 ...

  9. 【枚举】【二分答案】【分块答案】【BFS】【最大流】【Dinic】bzoj1189 [HNOI2007]紧急疏散evacuate...

    [法一]枚举Time(0~N*M): S->'.'(1); 'D'->T(Time); '.'->'D'(dis(用BFS预处理,注意一旦到达'D',BFS就不能继续扩展了,注意di ...

最新文章

  1. SANS:2012年度日志管理调查报告
  2. 【年度学术大会合集】SIGGRAPH,KDD,AAAI,NIPS…这些你想参加的会议
  3. Java面向对象知识总结
  4. [置顶] Responder一点也不神秘————iOS用户响应者链完全剖析
  5. 距离向量算法与链路状态算法(RIP、OSPF)
  6. Mybatis详细教程
  7. 【转载】金山词霸”屏幕取词技术揭密(讨论稿)
  8. C语言制作简谱播放器
  9. SaaS公司投资分析时,MRR比ARR指标更有用 | 投资人说
  10. go 获取文件的md5值
  11. ZIP 压缩解压命令
  12. python 计算gdp_使用Numpy计算Python-Gini系数
  13. win10计算机组共享的打印机,Win10系统局域网共享打印机设置 共享大地Win10打印机的方法...
  14. android 高光动画,InstrumentPanelView
  15. 什么是 SRE?一文详解 SRE 运维体系
  16. Html 和 Css 的杂乱总结
  17. 手机拨出等待时间长_手机打不出去电话怎么回事 一分钟轻松排查原因
  18. Android警告信息:Use Autofill
  19. idea恢复被覆盖的本地未提交代码
  20. 机器学习-白板推导系列(一)-绪论(机器学习的MLE(最大似然估计)和MAP(最大后验估计))

热门文章

  1. Linux Centos7安装Oracle12c第二版本
  2. JS_ECMA基本语法中的几种封装的小函数
  3. 软件工程作业之小学数学题目
  4. Swift - 14 - 字符串的基础操作
  5. Ubuntu 中Eclipse 默认的OpenJDK 和 SUNJDK问题总结
  6. imoocLinux环境变量配置文件笔记
  7. CSS中的Position属性
  8. 【转】2010全球最值得模仿的230个网站
  9. gj7 对象引用、可变性和垃圾回收
  10. Zabbix 企业级监控_