1305: [CQOI2009]dance跳舞

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 1340  Solved: 581
[Submit][Status]

Description

一次舞会有n个男孩和n个女孩。每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞。每个男孩都不会和同一个女孩跳两首(或更多)舞曲。有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”)。每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜欢的男孩跳舞。给出每对男孩女孩是否相互喜欢的信息,舞会最多能有几首舞曲?

Input

第一行包含两个整数n和k。以下n行每行包含n个字符,其中第i行第j个字符为'Y'当且仅当男孩i和女孩j相互喜欢。

Output

仅一个数,即舞曲数目的最大值。

Sample Input

3 0
YYY
YYY
YYY

Sample Output

3

HINT

N<=50 K<=30

Source

加强数据By dwellings and liyizhen2

這道題知道是二分+網絡流後,就是完完全全的水題了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<ctime>
  6. #include<cmath>
  7. #include<algorithm>
  8. #include<set>
  9. #include<map>
  10. #include<vector>
  11. #include<string>
  12. #include<queue>
  13. using namespace std;
  14. #ifdef WIN32
  15. #define LL "%I64d"
  16. #else
  17. #define LL "%lld"
  18. #endif
  19. #define MAXN 55
  20. #define MAXV MAXN*MAXN*2
  21. #define MAXE MAXV*2
  22. #define INF 0x3f3f3f3f
  23. #define INFL 0x3f3f3f3f3f3f3f3fLL
  24. typedef long long qword;
  25. inline int nextInt()
  26. {
  27. char ch;
  28. int x=;
  29. bool flag=false;
  30. do
  31. ch=getchar(),flag=(ch=='-')?true:flag;
  32. while(ch<''||ch>'');
  33. do x=x*+ch-'';
  34. while (ch=getchar(),ch<='' && ch>='');
  35. return x*(flag?-:);
  36. }
  37.  
  38. int n,m;
  39.  
  40. char mp[MAXN][MAXN];
  41. struct Edge
  42. {
  43. int val,np;
  44. Edge *next,*neg;
  45. }E[MAXE],*V[MAXV];
  46. int tope=;
  47. int sour=,sink=;
  48. inline void addedge(int x,int y,int z)
  49. {
  50. //cout<<"Add edge:<"<<tope+1<<">"<<x<<" "<<y<<":"<<z<<endl;
  51. E[++tope].np=y;
  52. E[tope].val=z;
  53. E[tope].next=V[x];
  54. V[x]=&E[tope];
  55.  
  56. E[++tope].np=x;
  57. E[tope].val=;
  58. E[tope].next=V[y];
  59. V[y]=&E[tope];
  60.  
  61. E[tope].neg=&E[tope-];
  62. E[tope-].neg=&E[tope];
  63. }
  64. int q[MAXV],lev[MAXV];
  65. int vis[MAXV],bfstime=;
  66. bool bfs()
  67. {
  68. int i,j;
  69. int head=-,tail=;
  70. Edge *ne;
  71. lev[sour]=;
  72. vis[sour]=++bfstime;
  73. q[]=sour;
  74. while (head<tail)
  75. {
  76. for (ne=V[q[++head]];ne;ne=ne->next)
  77. {
  78. if (!ne->val || vis[ne->np]==bfstime)continue;
  79. q[++tail]=ne->np;
  80. vis[ne->np]=bfstime;
  81. lev[ne->np]=lev[q[head]]+;
  82. }
  83. }
  84. return vis[sink]==bfstime;
  85. }
  86. int dfs(int now,int maxf)
  87. {
  88. int ret=,t;
  89. if (now==sink || !maxf)return maxf;
  90. Edge* ne;
  91. for (ne=V[now];ne;ne=ne->next)
  92. {
  93. if (!ne->val || lev[ne->np]!=lev[now]+)continue;
  94. t=dfs(ne->np,min(maxf,ne->val));
  95. ne->val-=t;
  96. ne->neg->val+=t;
  97. maxf-=t;
  98. ret+=t;
  99. //cout<<"Flow:"<<now<<"-"<<ne->np<<":"<<x<<"("<<ne->val<<")"<<endl;
  100. }
  101. if (!ret)lev[now]=-;
  102. return ret;
  103. }
  104. int dinic()
  105. {
  106. int ret=;
  107. while (bfs())
  108. {
  109. ret+=dfs(sour,INF);
  110. }
  111. return ret;
  112. }
  113.  
  114. int main()
  115. {
  116. freopen("input.txt","r",stdin);
  117. //freopen("output.txt","w",stdout);
  118. int i,j,k;
  119. int x,y,z;
  120. scanf("%d%d\n",&n,&m);
  121. for (i=;i<n;i++)
  122. {
  123. fgets(mp[i],MAXN,stdin);
  124. }
  125. int ans=;
  126. int l=,r=n+,mid;
  127. while (l+<r)
  128. {
  129. memset(V,,sizeof(V));
  130. tope=-;
  131. mid=(l+r)>>;
  132. for (i=;i<n;i++)
  133. {
  134. addedge(sour,+i,mid);
  135. addedge(+i,+i+n*,m);
  136. addedge(+i+n,sink,mid);
  137. addedge(+i+n+n*,+i+n,m);
  138. }
  139. for (i=;i<n;i++)
  140. {
  141. for (j=;j<n;j++)
  142. {
  143. if (mp[i][j]!='Y')
  144. {
  145. addedge(+i+n*,+n+j+n*,);
  146. }else
  147. {
  148. addedge(+i,+j+n,);
  149. }
  150. }
  151. }
  152. ans=dinic();
  153. if (ans!=mid*n)
  154. {
  155. r=mid;
  156. }else
  157. {
  158. l=mid;
  159. }
  160. }
  161. printf("%d\n",l);
  162. return ;
  163. }

bzoj 1305: [CQOI2009]dance 二分+網絡流判定的更多相关文章

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

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

  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 CQOI2009 dance跳舞 二分答案+最大流

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

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

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

  7. 1305: [CQOI2009]dance跳舞 - BZOJ

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

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

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

  9. BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...

随机推荐

  1. sqlServer将多字段设为主键方法

    补充一下关于数据库多字段复合主键的设置. 首先一个表是不能有多个主键的.但是可以有多个字段组合成一个主键,这就是为什么有时候表里为什么会有多个字段都有主键的标志,那是因为他们组合成了一个主键了.我们可 ...

  2. 开源免费天气预报接口API以及全国全部地区代码!!(国家气象局提供)

    国家气象局提供的天气预报接口 接口地址: http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/data ...

  3. iOS开发-javaScript交互

    前言 当前混合开发模式迎来了前所未有的发展,跨平台开发.热更新等优点决定了这种模式的重要地位.虽然前端界面在交互.动效等多方面距离原生应用还有差距,但毫无疑问混合开发只会被越来越多的公司接受.在iOS ...

  4. jsp获取服务端的访问信息

    获取服务端访问信息 public static String getUrl(HttpServletRequest request){ String url = ""; if(req ...

  5. select/**/*/**/from/**/RegSite

    select/**/*/**/from/**/RegSite  这样写sql也是可以的 替换空格

  6. Jquery Call WebDav

    最近研究了一下WebDav,尝试了一下用Jquery.ajax 发生请求访问WebDav. 代码如下: <!DOCTYPE html> <html xmlns="http: ...

  7. 苹果手机 iframe 无法滚动bug

    原来在html5下,iframe 只有 src 属性scroling='no' 解决办法:在iframe外加一层第div,设置样式-webkit-overflow-scrolling:touch;ov ...

  8. 会话技术之Cookie 和 Session

    为什么要使用会话技术 会话从字面上来说就是,就是两个人说话,也就是两个人交流,那么这里说的是计算机web端的交流,因为互联网是基于HTTP传输信息的,而http传输是无状态协议,缺少状态,意味着如果后 ...

  9. 如何打包成jar包自己看呢?

    第一步:选择你要导出的部分 第二步:

  10. (转)xml序列化

    在 .NET Framework 中提供两种串行化方法,一种是二进制法,另一种是xml串行化. 序列化是将对象状态转换为可保持或传输的格式的过程,xml序列化是将对象的公共字段和属性序列化为xml流. ...