二分答案+网络最大流

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<vector>
  5. #include<queue>
  6. #include<algorithm>
  7. using namespace std;
  8.  
  9. int N,M;
  10. const int maxn = + ;
  11. const int INF = 0x7FFFFFFF;
  12. struct Edge
  13. {
  14. int from, to, cap, flow;
  15. Edge(int u, int v, int c, int f) :from(u), to(v), cap(c), flow(f){}
  16. };
  17. vector<Edge>edges;
  18. vector<int>G[maxn];
  19. bool vis[maxn];
  20. int d[maxn];
  21. int cur[maxn];
  22. int n, m, s, t;
  23. int U[maxn*],V[maxn*];
  24. int tot;
  25. int T[maxn];
  26. char ss[maxn];
  27.  
  28. void init()
  29. {
  30. for(int i = ; i < maxn; i++) G[i].clear();
  31. edges.clear();
  32. tot=;
  33. memset(T,,sizeof T);
  34. }
  35.  
  36. void AddEdge(int from, int to, int cap)
  37. {
  38. edges.push_back(Edge(from, to, cap, ));
  39. edges.push_back(Edge(to, from, , ));
  40. int w = edges.size();
  41. G[from].push_back(w - );
  42. G[to].push_back(w - );
  43. }
  44.  
  45. bool BFS()
  46. {
  47. memset(vis, , sizeof(vis));
  48. queue<int>Q;
  49. Q.push(s);
  50. d[s] = ;
  51. vis[s] = ;
  52. while (!Q.empty())
  53. {
  54. int x = Q.front();
  55. Q.pop();
  56. for (int i = ; i<G[x].size(); i++)
  57. {
  58. Edge e = edges[G[x][i]];
  59. if (!vis[e.to] && e.cap>e.flow)
  60. {
  61. vis[e.to] = ;
  62. d[e.to] = d[x] + ;
  63. Q.push(e.to);
  64. }
  65. }
  66. }
  67. return vis[t];
  68. }
  69.  
  70. int DFS(int x, int a)
  71. {
  72. if (x == t || a == )
  73. return a;
  74. int flow = , f;
  75. for (int &i = cur[x]; i<G[x].size(); i++)
  76. {
  77. Edge e = edges[G[x][i]];
  78. if (d[x]+ == d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>)
  79. {
  80. edges[G[x][i]].flow+=f;
  81. edges[G[x][i] ^ ].flow-=f;
  82. flow+=f;
  83. a-=f;
  84. if(a==) break;
  85. }
  86. }
  87. if(!flow) d[x] = -;
  88. return flow;
  89. }
  90.  
  91. int dinic(int s, int t)
  92. {
  93. int flow = ;
  94. while (BFS())
  95. {
  96. memset(cur, , sizeof(cur));
  97. flow += DFS(s, INF);
  98. }
  99. return flow;
  100. }
  101.  
  102. void Input()
  103. {
  104. int SS;
  105. for(int i=;i<=N;i++)
  106. {
  107. gets(ss);
  108. for(int ii=;ss[ii];ii++)
  109. if(ss[ii]==' ')
  110. {SS=ii;break;}
  111. int num=;
  112. for(int ii=SS+;;ii++)
  113. {
  114. if(ss[ii]>=''&&ss[ii]<='') num=num*+ss[ii]-'';
  115. if(ss[ii]==' '||ss[ii]=='\0')
  116. {
  117. U[tot]=i;V[tot]=N+num+;tot++;
  118. T[num]++;
  119. num=;
  120. }
  121. if(ss[ii]=='\0') break;
  122. }
  123. }
  124. }
  125.  
  126. void Solve()
  127. {
  128. int Ma=-INF;
  129. for(int i=;i<M;i++) if(T[i]>Ma) Ma=T[i];
  130. int Min=,Max=Ma;
  131. int Mid=(Min+Max)/;
  132. s=;t=N+M+;
  133. while()
  134. {
  135. for(int i = ; i < maxn; i++) G[i].clear();
  136. edges.clear();
  137. for(int i=;i<=N;i++) AddEdge(s,i,);
  138. for(int i=;i<tot;i++) AddEdge(U[i],V[i],INF);
  139. for(int i=N+;i<=N+M;i++) AddEdge(i,t,Mid);
  140. if(dinic(s,t)<N)
  141. {
  142. Min=Mid+;
  143. Mid=(Min+Max)/;
  144. }
  145. else
  146. {
  147. Max=Mid;
  148. Mid=(Min+Max)/;
  149. }
  150. if(Min==Max) break;
  151. }
  152. printf("%d\n",Min);
  153. }
  154.  
  155. int main()
  156. {
  157. while(~scanf("%d%d",&N,&M))
  158. {
  159. if(!N&&!M) break;
  160. scanf("\n");
  161. init();
  162. Input();
  163. Solve();
  164. }
  165. return ;
  166. }

POJ 2289 Jamie's Contact Groups的更多相关文章

  1. POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups / HDU 1699 Jamie's Contact Groups / SCU 1996 Jamie's Contact Groups (二分,二分图匹配)

    POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups ...

  2. Poj 2289 Jamie's Contact Groups (二分+二分图多重匹配)

    题目链接: Poj 2289 Jamie's Contact Groups 题目描述: 给出n个人的名单和每个人可以被分到的组,问将n个人分到m个组内,并且人数最多的组人数要尽量少,问人数最多的组有多 ...

  3. poj 2289 Jamie's Contact Groups【二分+最大流】【二分图多重匹配问题】

    题目链接:http://poj.org/problem?id=2289 Jamie's Contact Groups Time Limit: 7000MS   Memory Limit: 65536K ...

  4. POJ 2289——Jamie's Contact Groups——————【多重匹配、二分枚举匹配次数】

    Jamie's Contact Groups Time Limit:7000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I ...

  5. POJ 2289 Jamie's Contact Groups 二分图多重匹配 难度:1

    Jamie's Contact Groups Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 6511   Accepted: ...

  6. POJ 2289 Jamie's Contact Groups & POJ3189 Steady Cow Assignment

    这两道题目都是多重二分匹配+枚举的做法,或者可以用网络流,实际上二分匹配也就实质是网络流,通过枚举区间,然后建立相应的图,判断该区间是否符合要求,并进一步缩小范围,直到求出解.不同之处在对是否满足条件 ...

  7. POJ 2289 Jamie's Contact Groups (二分+最大流)

    题目大意: 有n个人,可以分成m个组,现在给出你每个人可以去的组的编号,求分成的m组中人数最多的组最少可以有多少人. 算法讨论: 首先喷一下这题的输入,太恶心了. 然后说算法:最多的最少,二分的字眼. ...

  8. 图论--网络流--最大流 POJ 2289 Jamie's Contact Groups (二分+限流建图)

    Description Jamie is a very popular girl and has quite a lot of friends, so she always keeps a very ...

  9. POJ 2289 Jamie's Contact Groups(多重匹配+二分)

    题意: Jamie有很多联系人,但是很不方便管理,他想把这些联系人分成组,已知这些联系人可以被分到哪个组中去,而且要求每个组的联系人上限最小,即有一整数k,使每个组的联系人数都不大于k,问这个k最小是 ...

随机推荐

  1. drupal7 上传文件中文乱码

    drupal7自带有file模块,可以上传文件. 但是存在问题:如果上传的文件名称是中文,存储在文件下面的文件名称是乱码的,解决办法如下:参考出处 includes/file.inc中,修改两处代码, ...

  2. java 文件的基本操作

    1 /** * java 文件操作 * 2016/5/10 **/ package cn.Java_7; import java.io.*; import java.util.Scanner; imp ...

  3. C语言_愤怒的小鸟

    // ConsoleApplication4.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<stdio.h> ...

  4. 调试MVC项目,不关闭 IIS EXPRESS

    在VS主面板打开:工具->选项->调试->编辑继续   取消选中[启用"编辑并继续"] 就OK了 (英文版的请对应相应的操作) 不过这是针对所有的调试,如果你想针 ...

  5. 用python写刷票程序

    刷票一般要突破以下限制: 1.验证码识别 2.同一ip不可连续投票 解决办法 1.用tesseract工具,链接在此 https://code.google.com/p/tesseract-ocr/  ...

  6. openwrt默认不开启wifi

    Openwrt默认不开启wifi,要开启的话, 修改这个文件: openwrt/trunk/package/kernel/mac80211/files/lib/wifi/mac80211.sh. 滚到 ...

  7. SharePoint 2010 应用url参数过滤列表视图数据(应用get办法过滤列表数据)

    名人名言:读活书,活读书,读书活.——郭沫若 题目其实不知道如何称呼才干合适大师的搜刮习惯.以便有类似题目经由过程百度或google可以搜刮到,其实就是在url后面添加参数过滤显示我们想要的成果,有人 ...

  8. AngularJS展示数据的ng-bind指令和{{}} 区别

    在AngularJS中显示模型中的数据有两种方式: 一种是使用花括号插值的方式: 1 <p>{{text}}</p> 另一种是使用基于属性的指令,叫做ng-bind: 1 &l ...

  9. Ajax交互,浏览器接收不到服务器的Json数据(跨域问题)

    该问题的情景如下: 问题描述 Ajax的请求代码放在一台机器上,而服务器的java 路由程序放在另一个机子上,所以Ajax的url填写的是带"http://"  的地址,而不是相对 ...

  10. Spring.NET 中的 ADO.NET 数据访问的示例

    Spring.NET 1.3.1 中提供了一个使用 AdoTemplate 的完整示例,包括使用泛型和使用非泛型技术进行数据访问,这个示例位于下载的压缩包中\Spring.NET-1.3.1\Spri ...