1. 一次舞会有n个男孩和n个女孩。每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞。每个男孩都不会和同一个女孩跳两首(或更多)舞曲。
    有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”)。每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞。
    给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲?
  2.  
  3. Input
  4. 第一行包含两个整数nk。以下n行每行包含n个字符,其中第i行第j个字符为'Y'当且仅当男孩i和女孩j相互喜欢。
  5.  
  6. Output
  7. 仅一个数,即舞曲数目的最大值。
  8.  
  9. Sample Input
  10.  
  11. YYY
  12. YYY
  13. YYY
  14. Sample Output
  15.  
  16. Hint
  17. N<= K<=

思路:二分答案,然后最大流。

建图:对于每个男生,拆成两个点A,B(而且A给B分流,流量为K):A用来连接喜欢的女生,B用来连接不喜欢的女生。很明显,二分到num时,给个A拥有num的流量,B拥有K流量。

同理:女生那里也要拆点。并且,男生流出的流和女生进入的流都要加num的限制。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. const int inf=;
  8. const int maxn=;
  9. char mp[][];
  10. int Laxt[maxn],Next[maxn],To[maxn],cap[maxn],cnt;
  11. int dis[maxn],vd[maxn],S,N,T,K;
  12. void add(int u,int v,int val)
  13. {
  14. Next[++cnt]=Laxt[u];
  15. Laxt[u]=cnt;
  16. To[cnt]=v;
  17. cap[cnt]=val;
  18. }
  19. int sap(int u,int flow)
  20. {
  21. if(flow==||u==T) return flow;
  22. int tmp,delta=;
  23. for(int i=Laxt[u];i;i=Next[i]){
  24. if(dis[u]==dis[To[i]]+&&cap[i]>){
  25. tmp=sap(To[i],min(cap[i],flow-delta));
  26. delta+=tmp;
  27. cap[i]-=tmp;
  28. cap[i^]+=tmp;
  29. if(delta==flow||dis[S]>T+) return delta;
  30. }
  31. }
  32. vd[dis[u]]--;
  33. if(vd[dis[u]]==) dis[S]=T+;
  34. vd[++dis[u]]++;
  35. return delta;
  36. }
  37. bool check(int num)
  38. {
  39. int res=; cnt=;
  40. for(int i=S;i<=T;i++) Laxt[i]=dis[i]=vd[i]=;
  41. for(int i=;i<=N;i++) { add(S,i,num); add(i,S,); } //分散给男生
  42. for(int i=;i<=N;i++) { add(i,N+i,K); add(N+i,i,); } //给不喜欢的分配名额
  43. for(int i=;i<=N;i++)
  44. for(int j=;j<=N;j++)
  45. if(mp[i][j]=='Y'){ add(i,*N+j,);add(*N+j,i,); } //给喜欢的女生分配
  46. else { add(N+i,*N+j,); add(*N+j,N+i,); }//给不喜欢的分配
  47. for(int i=*N+;i<=*N+N;i++){ add(i,N+i,K); add(T,i,); } //汇聚到女生
  48. for(int i=*N+;i<=*N+N;i++){ add(i,T,num); add(T,i,); } //汇聚到汇点
  49. while(dis[S]<=T+) res+=sap(S,inf);
  50. if(res==num*N) return true;
  51. return false;
  52. }
  53. int main()
  54. {
  55. scanf("%d%d",&N,&K); S=; T=*N+;
  56. for(int i=;i<=N;i++) scanf("%s",mp[i]+);
  57. int L=,R=N,Mid,ans=;
  58. while(L<=R){
  59. Mid=(L+R)>>;
  60. if(check(Mid)) ans=Mid,L=Mid+;
  61. else R=Mid-;
  62. }
  63. printf("%d\n",ans);
  64. return ;
  65. }

BZOJ 1305:dance跳舞(二分+最大流)的更多相关文章

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

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

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

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

  3. BZOJ 1305--[CQOI2009]dance跳舞(最大流)

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

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

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

  5. bzoj 1305 dance跳舞

    最大流. 首先二分答案,问题转化为x首舞曲是否可行. 考虑建图,对每个人建立三个点,分别表示全体,喜欢和不喜欢. 源点向每个男生全体点连一条容量为x的边. 每个男生整体点向喜欢点连一条容量为正无穷的边 ...

  6. [CQOI2009]dance跳舞(最大流+二分)

    [CQOI2009]dance跳舞 每个人拆成$2$个点,表示是否与喜欢的人跳舞 跳$m$首舞曲时,满足最大流为$n*m$ 二分$m$,跑最大流即可 #include<cstdio> #i ...

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

    题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连 ...

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

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

  9. 1305. [CQOI2009]跳舞【最大流+二分】

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

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

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

随机推荐

  1. XV6第一个进程

    第一个进程 本章通过第一个进程的创建来解释 xv6 是如何开始运行的,让我们得以一窥 xv6 提供的各个抽象是如何实现和交互的.xv6 尽量复用了普通操作的代码来建立第一个进程,避免单独为其撰写代码. ...

  2. Leetcode 274.H指数

    H指数 给定一位研究者论文被引用次数的数组(被引用次数是非负整数).编写一个方法,计算出研究者的 h 指数. h 指数的定义: "一位有 h 指数的学者,代表他(她)的 N 篇论文中至多有 ...

  3. Laya 利用JS进行反射

    Laya 利用JS进行反射 @author ixenos 当需要配表调用函数时,可以利用js的eval来调用 1.在配置js中写下: function callAsFunc(funcName){ ev ...

  4. Android滚动页面位置指示器:CircleIndicator

     Android滚动页面位置指示器:CircleIndicator CircleIndicator是github上的一个开源的用于页面滚动时候的位置指示器,指示当前页面在总的页面中的位置和前后位置 ...

  5. POJ1061青蛙的约会

    Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事 ...

  6. 转载:shell脚本之前的基础知识

    转载地址:http://www.92csz.com/study/linux/12.htm 第十二章 学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果 ...

  7. Codevs 队列练习 合并版

    3185 队列练习 1  时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定一个队列(初始为空),只有两种操作入队和出队,现给出这 ...

  8. ztr loves lucky numbers--hdu5676(DFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=5676 题目大意: 给你一个数  让你找比这数大并且只含4和7  并且4和7的个数一样 枚举从0到10的18次方之 ...

  9. delphi 修改文件夹名和文件名

    unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Form ...

  10. Visual Studio VS如何修改代码字体

    工具-选项-环境-字体和颜色