考虑如果没有k个人,那么就是裸的二分答案+最大流
对于这k个人,再在原来的每一个点裂点,中间的流量为k,然后裂出来的点向所有不能匹配的点连边,再二分答案+最大流即可

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 #define N 205
  4. 4 struct ji{
  5. 5 int nex,to,len;
  6. 6 }edge[N*N];
  7. 7 queue<int>q;
  8. 8 int E,n,k,head[N],work[N],d[N];
  9. 9 char s[N][N];
  10. 10 void add(int x,int y,int z){
  11. 11 edge[E].nex=head[x];
  12. 12 edge[E].to=y;
  13. 13 edge[E].len=z;
  14. 14 head[x]=E++;
  15. 15 if (E&1)add(y,x,0);
  16. 16 }
  17. 17 bool bfs(){
  18. 18 memset(d,-1,sizeof(d));
  19. 19 q.push(0);
  20. 20 d[0]=0;
  21. 21 while (!q.empty()){
  22. 22 int k=q.front();
  23. 23 q.pop();
  24. 24 for(int i=head[k];i!=-1;i=edge[i].nex)
  25. 25 if ((edge[i].len)&&(d[edge[i].to]<0)){
  26. 26 d[edge[i].to]=d[k]+1;
  27. 27 q.push(edge[i].to);
  28. 28 }
  29. 29 }
  30. 30 return d[4*n+1]>=0;
  31. 31 }
  32. 32 int dfs(int k,int s){
  33. 33 if (k>4*n)return s;
  34. 34 for(int &i=work[k];i!=-1;i=edge[i].nex)
  35. 35 if ((edge[i].len)&&(d[edge[i].to]==d[k]+1)){
  36. 36 int p=dfs(edge[i].to,min(s,edge[i].len));
  37. 37 if (p){
  38. 38 edge[i].len-=p;
  39. 39 edge[i^1].len+=p;
  40. 40 return p;
  41. 41 }
  42. 42 }
  43. 43 return 0;
  44. 44 }
  45. 45 int dinic(){
  46. 46 int k,ans=0;
  47. 47 while (bfs()){
  48. 48 memcpy(work,head,sizeof(head));
  49. 49 while (k=dfs(0,0x3f3f3f3f))ans+=k;
  50. 50 }
  51. 51 return ans;
  52. 52 }
  53. 53 bool pd(int mid){
  54. 54 memset(head,-1,sizeof(head));
  55. 55 E=0;
  56. 56 for(int i=1;i<=n;i++){
  57. 57 add(0,i,mid);
  58. 58 add(i,i+n,k);
  59. 59 add(i+2*n,4*n+1,mid);
  60. 60 add(i+3*n,i+2*n,k);
  61. 61 }
  62. 62 for(int i=1;i<=n;i++)
  63. 63 for(int j=0;j<n;j++)
  64. 64 if (s[i][j]=='Y')add(i,j+2*n+1,1);
  65. 65 else add(i+n,j+3*n+1,1);
  66. 66 return dinic()==mid*n;
  67. 67 }
  68. 68 int main(){
  69. 69 scanf("%d%d",&n,&k);
  70. 70 for(int i=1;i<=n;i++)scanf("%s",s[i]);
  71. 71 int l=0,r=n;
  72. 72 while (l<r){
  73. 73 int mid=(l+r+1>>1);
  74. 74 if (pd(mid))l=mid;
  75. 75 else r=mid-1;
  76. 76 }
  77. 77 printf("%d",l);
  78. 78 }

[bzoj1305]跳舞的更多相关文章

  1. 【BZOJ1305】跳舞(网络流)

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

  2. [BZOJ1305][CQOI2009]跳舞(网络流)

    1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 3944  Solved: 1692[Submit][St ...

  3. 【BZOJ1305】dance跳舞(最大流,裂点,二分答案)

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

  4. Bzoj1305 [CQOI2009]dance跳舞

    Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 2925  Solved: 1221 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时 ...

  5. BZOJ-1305 dance跳舞 建图+最大流+二分判定

    跟随YveH的脚步又做了道网络流...%%% 1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 2119 S ...

  6. 【BZOJ1305】 [CQOI2009]dance跳舞

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

  7. 【BZOJ1305】【CQOI2009】 dance跳舞

    看menci的博客点出二分的思路然后做出来,menci太强辣 原题: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲. ...

  8. bzoj千题计划130:bzoj1305: [CQOI2009]dance跳舞

    http://www.lydsy.com/JudgeOnline/problem.php?id=1305 每个人拆为喜欢(yes)和不喜欢(no)两个点 二分答案 1.每两个人之间只能跳一次 喜欢则 ...

  9. BZOJ1305 [CQOI2009]dance跳舞 【网络流】

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

随机推荐

  1. IDEA Web渲染插件开发(二)— 自定义JsDialog

    <IDEA Web渲染插件开发(一)>中,我们了解到了如何编写一款用于显示网页的插件,所需要的核心知识点就是IDEA插件开发和JCEF,在本文中,我们将继续插件的开发,为该插件的JS Di ...

  2. Jekins 插件Extended Choice Parameter显示Json Parameter Type遇到的问题

    在jenkins中使用Extended Choice Parameter插件用来显示自定义的多选项,尝试通过groovy script来显示,正常,但查看它的例子,发现它例子中多选是通过类型 Json ...

  3. Java秘诀!Java赋值运算符介绍

    运算符丰富是 Java 语言的主要特点之一,它提供的运算符数量之多,在高级语言中是少见的. Java 语言中的运算符除了具有优先级之外,还有结合性的特点.当一个表达式中出现多种运算符时,执行的先后顺序 ...

  4. jenkins容器内安装Python3之后使用pip3 install xxx失败,可以考虑换国内源

    问题:pip3 install xxx失败 方案一:修改配置文件 首先在当前用户目录下建立文件夹.pip,然后在文件夹中创建pip.conf文件,再将源地址加进去即可. mkdir ~/.pipvim ...

  5. 关于SSTI的坑

    SSTI注入 进过几天的CSDN和博客园以及个人博客的查询,我大概讲一下我对SSTI模板注入的理解. SSTI注入指的是模板注入(应该翻译就是模板注入) 就站在我所了解的知识水平(大概就是大一随便水了 ...

  6. 2020.5.4-ICPC Pacific Northwest Regional Contest 2019

    A. Radio Prize All boring tree-shaped lands are alike, while all exciting tree-shaped lands are exci ...

  7. Redis 面试常见问题———缓存雪崩、缓存击穿以及缓存穿透

    在开发中会面临缓存异常可能会出现三个问题,分别是缓存雪崩.缓存击穿和缓存穿透.这三个问题会导致大量请求从缓存转移到数据库,如果请求的并发量很大的话,就会导致数据库崩溃.所以在面试官也会经常问这些问题. ...

  8. Docker 常见命令

    Docker 运行流程 辅助命令 # 1.安装完成辅助命令 docker version -------------------------- 查看docker的信息 docker info ---- ...

  9. 23.合并k个有序链表

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: 1-&g ...

  10. Java:阻塞队列

    Java:阻塞队列 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. 概述 概念 队列 队列就可以想成是一个数组,从一头进入,一头出去,排队买饭 阻塞队列 B ...