二分+二分图多重匹配。

  1. /* 1669 */
  2. #include <iostream>
  3. #include <string>
  4. #include <map>
  5. #include <queue>
  6. #include <set>
  7. #include <stack>
  8. #include <vector>
  9. #include <deque>
  10. #include <algorithm>
  11. #include <cstdio>
  12. #include <cmath>
  13. #include <ctime>
  14. #include <cstring>
  15. #include <climits>
  16. #include <cctype>
  17. #include <cassert>
  18. #include <functional>
  19. #include <iterator>
  20. #include <iomanip>
  21. using namespace std;
  22. //#pragma comment(linker,"/STACK:102400000,1024000")
  23.  
  24. #define sti set<int>
  25. #define stpii set<pair<int, int> >
  26. #define mpii map<int,int>
  27. #define vi vector<int>
  28. #define pii pair<int,int>
  29. #define vpii vector<pair<int,int> >
  30. #define rep(i, a, n) for (int i=a;i<n;++i)
  31. #define per(i, a, n) for (int i=n-1;i>=a;--i)
  32. #define clr clear
  33. #define pb push_back
  34. #define mp make_pair
  35. #define fir first
  36. #define sec second
  37. #define all(x) (x).begin(),(x).end()
  38. #define SZ(x) ((int)(x).size())
  39. #define lson l, mid, rt<<1
  40. #define rson mid+1, r, rt<<1|1
  41.  
  42. const int maxn = ;
  43. const int maxm = ;
  44. bool M[maxn][maxm];
  45. bool visit[maxm];
  46. int can[maxm][maxm];
  47. int sz[maxm];
  48. int n, gn, bound;
  49.  
  50. bool dfs(int u) {
  51. rep(i, , gn) {
  52. if (M[u][i] && !visit[i]) {
  53. visit[i] = true;
  54. if (sz[i] < bound) {
  55. can[i][sz[i]++] = u;
  56. return true;
  57. }
  58. rep(j, , sz[i]) {
  59. if (dfs(can[i][j])) {
  60. can[i][j] = u;
  61. return true;
  62. }
  63. }
  64. }
  65. }
  66.  
  67. return false;
  68. }
  69.  
  70. bool judge(int bound_) {
  71. bound = bound_;
  72. memset(sz, , sizeof(sz));
  73. rep(i, , n) {
  74. memset(visit, false, sizeof(visit));
  75. if (!dfs(i))
  76. return false;
  77. }
  78.  
  79. return true;
  80. }
  81.  
  82. void solve() {
  83. int l, r, mid;
  84. int ans;
  85.  
  86. l = ;
  87. ans = r = n;
  88. while (l <= r) {
  89. mid = (l + r) >> ;
  90. if (judge(mid)) {
  91. ans = mid;
  92. r = mid - ;
  93. } else {
  94. l = mid + ;
  95. }
  96. }
  97.  
  98. printf("%d\n", ans);
  99. }
  100.  
  101. int main() {
  102. ios::sync_with_stdio(false);
  103. #ifndef ONLINE_JUDGE
  104. freopen("data.in", "r", stdin);
  105. freopen("data.out", "w", stdout);
  106. #endif
  107.  
  108. char name[];
  109. int gid;
  110. char ch;
  111.  
  112. while (scanf("%d %d", &n, &gn)!=EOF && (n||gn)) {
  113. memset(M, false, sizeof(M));
  114. rep(i, , n) {
  115. scanf("%s", name);
  116. while () {
  117. scanf("%d%c", &gid, &ch);
  118. M[i][gid] = true;
  119. if (ch == '\n')
  120. break;
  121. }
  122. }
  123. solve();
  124. }
  125.  
  126. #ifndef ONLINE_JUDGE
  127. printf("time = %d.\n", (int)clock());
  128. #endif
  129.  
  130. return ;
  131. }

二分+网络流Dinic也可以解。

  1. /* 1669 */
  2. #include <iostream>
  3. #include <string>
  4. #include <map>
  5. #include <queue>
  6. #include <set>
  7. #include <stack>
  8. #include <vector>
  9. #include <deque>
  10. #include <algorithm>
  11. #include <cstdio>
  12. #include <cmath>
  13. #include <ctime>
  14. #include <cstring>
  15. #include <climits>
  16. #include <cctype>
  17. #include <cassert>
  18. #include <functional>
  19. #include <iterator>
  20. #include <iomanip>
  21. using namespace std;
  22. //#pragma comment(linker,"/STACK:102400000,1024000")
  23.  
  24. #define sti set<int>
  25. #define stpii set<pair<int, int> >
  26. #define mpii map<int,int>
  27. #define vi vector<int>
  28. #define pii pair<int,int>
  29. #define vpii vector<pair<int,int> >
  30. #define rep(i, a, n) for (int i=a;i<n;++i)
  31. #define per(i, a, n) for (int i=n-1;i>=a;--i)
  32. #define clr clear
  33. #define pb push_back
  34. #define mp make_pair
  35. #define fir first
  36. #define sec second
  37. #define all(x) (x).begin(),(x).end()
  38. #define SZ(x) ((int)(x).size())
  39. #define lson l, mid, rt<<1
  40. #define rson mid+1, r, rt<<1|1
  41.  
  42. typedef struct {
  43. int v, c, nxt;
  44. } Edge_t;
  45.  
  46. const int INF = 0x3f3f3f3f;
  47. const int maxn = ;
  48. const int maxm = ;
  49. const int maxv = maxn + maxm;
  50. const int maxe = maxn*maxm*+;
  51. Edge_t E[maxe];
  52. int F[maxe];
  53. int head[maxv], head_[maxv];
  54. int id[maxm];
  55. int dis[maxv], Q[maxv];
  56. int m;
  57. int n, gn;
  58. int s, t;
  59.  
  60. void init() {
  61. memset(head, -, sizeof(head));
  62. m = ;
  63. s = ;
  64. t = n + gn + ;
  65. }
  66.  
  67. void addEdge(int u, int v, int c) {
  68. E[m].v = v;
  69. E[m].c = c;
  70. E[m].nxt = head[u];
  71. head[u] = m++;
  72.  
  73. E[m].v = u;
  74. E[m].c = ;
  75. E[m].nxt = head[v];
  76. head[v] = m++;
  77. }
  78.  
  79. bool bfs() {
  80. int l = , r = ;
  81. int u, v, k;
  82.  
  83. Q[r++] = s;
  84. memset(dis, , sizeof(dis));
  85. dis[s] = ;
  86.  
  87. while (l < r) {
  88. u = Q[l++];
  89. for (k=head[u]; k!=-; k=E[k].nxt) {
  90. v = E[k].v;
  91. if (!dis[v] && E[k].c>F[k]) {
  92. dis[v] = dis[u] + ;
  93. if (v == t)
  94. return false;
  95. Q[r++] = v;
  96. }
  97. }
  98. }
  99.  
  100. return true;
  101. }
  102.  
  103. int dfs(int u, int val) {
  104. if (u==t || val==)
  105. return val;
  106.  
  107. int ret = ;
  108. int tmp, v;
  109.  
  110. for (int& k=head_[u]; k!=-; k=E[k].nxt) {
  111. v = E[k].v;
  112. if (dis[v]==dis[u]+ && E[k].c>F[k] && (tmp=dfs(v, min(val, E[k].c-F[k])))>) {
  113. F[k] += tmp;
  114. F[k^] -= tmp;
  115. ret += tmp;
  116. val -= tmp;
  117. if (val == )
  118. break;
  119. }
  120. }
  121.  
  122. return ret;
  123. }
  124.  
  125. int Dinic() {
  126. int ret = , tmp;
  127.  
  128. while () {
  129. if (bfs())
  130. break;
  131.  
  132. memcpy(head_, head, sizeof(head));
  133. while () {
  134. tmp = dfs(s, INF);
  135. if (tmp == )
  136. break;
  137. ret += tmp;
  138. }
  139. }
  140. #ifndef ONLINE_JUDGE
  141. printf("Dinic = %d\n", ret);
  142. #endif
  143. return ret;
  144. }
  145.  
  146. bool judge(int bound) {
  147. rep(i, , gn+)
  148. E[id[i]].c = bound;
  149. memset(F, , sizeof(F));
  150.  
  151. return Dinic()>=n;
  152. }
  153.  
  154. void solve() {
  155. int l = , r = n, mid;
  156. int ans = -;
  157.  
  158. while (r >= l) {
  159. mid = (l + r) >> ;
  160. if (judge(mid)) {
  161. ans = mid;
  162. r = mid - ;
  163. } else {
  164. l = mid + ;
  165. }
  166. }
  167.  
  168. printf("%d\n", ans);
  169. }
  170.  
  171. int main() {
  172. ios::sync_with_stdio(false);
  173. #ifndef ONLINE_JUDGE
  174. freopen("data.in", "r", stdin);
  175. freopen("data.out", "w", stdout);
  176. #endif
  177.  
  178. char name[];
  179. char ch;
  180. int gid;
  181.  
  182. while (scanf("%d %d", &n, &gn)!=EOF && (n||gn)) {
  183. init();
  184. rep(i, , n+) {
  185. scanf("%s", name);
  186. while () {
  187. scanf("%d%c", &gid, &ch);
  188. addEdge(i, gid+n+, );
  189. if (ch == '\n')
  190. break;
  191. }
  192. }
  193. rep(i, , n+)
  194. addEdge(s, i, );
  195. rep(i, , gn+) {
  196. id[i] = m;
  197. addEdge(n+i, t, );
  198. }
  199. solve();
  200. }
  201.  
  202. #ifndef ONLINE_JUDGE
  203. printf("time = %d.\n", (int)clock());
  204. #endif
  205.  
  206. return ;
  207. }

【HDOJ】1669 Jamie's Contact Groups的更多相关文章

  1. HDU 1669 Jamie's Contact Groups(多重匹配+二分枚举)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1669 题目大意: 给你各个人可以属于的组,把这些人分组,使这些组中人数最多的组人数最少,并输出这个人数 ...

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

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

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

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

  4. 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 ...

  5. POJ2289 Jamie's Contact Groups(二分图多重匹配)

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

  6. Jamie's Contact Groups POJ - 2289(多重匹配 最大值最小化 最大流)

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

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

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

  8. POJ2289:Jamie's Contact Groups(二分+二分图多重匹配)

    Jamie's Contact Groups Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/ ...

  9. POJ2289 Jamie's Contact Groups —— 二分图多重匹配/最大流 + 二分

    题目链接:https://vjudge.net/problem/POJ-2289 Jamie's Contact Groups Time Limit: 7000MS   Memory Limit: 6 ...

随机推荐

  1. 利用微软类库 Visual Studio International Pack 汉字转拼音

    首先,从微软官网下载安装包:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=44CAC7F0-633B-477D-AED2 ...

  2. Golden32 别名时中文 报ORA-00911: invalid character错误

    查询数据库软件我一般用两个:PL SQL和golden32:使用golden32-之前使用的时候别名为中文是没有任何问题:直到我想将PL SQL汉化(使用中文包chinese.exe),汉化完后再次查 ...

  3. iOS UIView 快速修改 frame,

    在iOS开发布局修改 frame 时需要繁琐的代码实现,今天偶尔看到一播客说到快速修改的 frame 的方法,自己动手写了一遍实现代码. 快速实现主要通过 添加类目的方式,对UIView 控件添加了一 ...

  4. ReactiveCocoa入门教程——第一部分(转)

    作为一个iOS开发者,你写的每一行代码几乎都是在响应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation).但是这些事件都用不同的方式来处理 ...

  5. SQL 刪除

    SQL 刪除 1.delete from table_name 2.drop table table_name drop table is different from deleting all of ...

  6. MySQL生产库主从重新同步操作注意事项

    因为一些原因,我们会遇到生产主从库重新同步的时候.重新同步MYSQL主从的时候有有一些注意的地方. 从库还原前一定要记得reset,因为重启mysql并不影响复制进程,如果忘记reset,会导致你一边 ...

  7. 【JSP&Servlet学习笔记】4.会话管理

    Http本身是无状态通信协议,要进行会话管理的基本原理,就是将需要维护的状态回应给浏览器,由浏览器在下次请求时主动发送状态信息,让Web应用程序“得知”请求之间的关联. 隐藏字段是将状态信息以窗体中看 ...

  8. jQuery—一些常见方法(3)【width(),innerWidth(),outerWidth()】

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. php class类的用法详细总结

    以下是对php中class类的用法进行了详细的总结介绍,需要的朋友可以过来参考下 一:结构和调用(实例化): class className{} ,调用:$obj = new className(); ...

  10. VirtualBox 安装虚拟机时出现错误 VT-x features locked or unavailable in MSR.

    修改安装好的虚拟机的cup的个数重新启动的时候报了上述错误. 参考博文:http://blog.csdn.net/zklth/article/details/7019990 错误:VT-x featu ...