转载:http://www.cppblog.com/MatoNo1/archive/2011/03/26/142766.aspx

  我们知道在一个图中,每个点最多只能匹配一条边的情况,是二分图的最大匹配问题.然而还有种情况是:每个点可以匹配多条边,但有上限,假设为L.即Li表示最多点i可以和Li条边相关联.

二分图多重最大匹配:

1.建立一个源点S和汇点T.

2.S指向x顶点,容量为x内点的L值.y顶点指向T,容量为y内点的L值.

3.原图中的各边在新图中仍存在,容量为1.

那么S到T的最大流就是多重最大匹配.

例如POJ1698:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. #define _clr(x, y) memset(x, y, sizeof(x))
  5. #define Min(x, y) (x < y ? x : y)
  6. #define Max(x, y) (x > y ? x : y)
  7. #define INF 0x3f3f3f3f
  8. #define N 400
  9. using namespace std;
  10.  
  11. int edge[N][N], dist[N];
  12. int T, S, Sum, n;
  13. bool used[N];
  14.  
  15. bool bfs()
  16. {
  17. _clr(dist, -);
  18. queue<int> Q;
  19. dist[S] = ;
  20. Q.push(S);
  21. while(!Q.empty())
  22. {
  23. int u = Q.front();
  24. Q.pop();
  25. for(int v=; v<=T; v++)
  26. {
  27. if(edge[u][v] && dist[v]<)
  28. {
  29. dist[v] = dist[u] + ;
  30. Q.push(v);
  31. }
  32. }
  33. }
  34. return dist[T]>? : ;
  35. }
  36.  
  37. int dfs(int u, int alpha)
  38. {
  39. int a;
  40. if(u==T) return alpha;
  41. for(int i=; i<=T; i++)
  42. {
  43. if(edge[u][i] && dist[i]==dist[u]+ && (a=dfs(i, Min(alpha, edge[u][i]))))
  44. {
  45. edge[u][i] -= a;
  46. edge[i][u] += a;
  47. return a;
  48. }
  49. }
  50. dist[u] = -;
  51. return ;
  52. }
  53. void Dinic()
  54. {
  55. int ans=, a=;
  56. while(bfs())
  57. while(a=dfs(, INF)) ans += a;
  58. printf ("%s\n", ans==Sum ? "Yes" : "No");
  59. }
  60.  
  61. int main()
  62. {
  63. int K, week[];
  64. scanf("%d", &K);
  65. while(K--)
  66. {
  67. int day = , d, w;
  68. scanf("%d", &n);
  69. Sum = , S=;
  70. _clr(week, );
  71. _clr(edge, );
  72. for(int i=; i<=n; i++) // 1--n之间表示电影,n+1---T之间表示天数!
  73. {
  74. for(int i1=; i1<; i1++) scanf("%d", week+i1);
  75. scanf("%d%d", &d, &w);
  76. day = Max(day, w);
  77. edge[S][i] = d; // 源点向每个电影节点 x 连接一条权值为拍摄此电影所需天数的值.
  78. Sum += d;
  79.  
  80. for(int j=; j<w; j++) // W周之内完成.
  81. {
  82. for(int k=; k<; k++)
  83. if(week[k])
  84. edge[i][n+j*+k+] = ; //第i部电影可以在w周内的周k拍摄.
  85. }
  86. T = day*+n+;
  87. for(int i=n+; i<T; i++)
  88. edge[i][T] = ;
  89. }
  90. Dinic();
  91. }
  92. return ;
  93. }

POJ 1698 (二分图的多重匹配)的更多相关文章

  1. hihoCoder 1393 网络流三·二分图多重匹配(Dinic求二分图最大多重匹配)

    #1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小H ...

  2. POJ 2584 T-Shirt Gumbo 二分图的多重匹配

    题目链接:http://poj.org/problem?id=2584 题目大意:有SMLXT五种T恤型号,有N个人,每个人有一个可选的型号区间,你现在要发给N个人每人一条他可以选择的型号的T恤,问能 ...

  3. Poj 2112 Optimal Milking (多重匹配+传递闭包+二分)

    题目链接: Poj 2112 Optimal Milking 题目描述: 有k个挤奶机,c头牛,每台挤奶机每天最多可以给m头奶牛挤奶.挤奶机编号从1到k,奶牛编号从k+1到k+c,给出(k+c)*(k ...

  4. poj 2195 二分图最优匹配 或 最小费用最大流

    就是最基本的二分图最优匹配,将每个人向每个房子建一条边,权值就是他们manhattan距离.然后对所有权值取反,求一次最大二分图最优匹配,在将结果取反就行了. #include<iostream ...

  5. hdu 3605 Escape 二分图的多重匹配(匈牙利算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others)    ...

  6. poj 3565 二分图最优匹配

    思路: 将ant与tree之间用距离来做权值,求最小权匹配就可以了.可以想到,如果有两条线段相交,那么将这两个线段交换一个顶点,使其不相交,其权值和一定会更小. 就像斜边永远比直角边长一样的道理. # ...

  7. POJ - 2289 Jamie's Contact Groups (二分图多重匹配)

    题意:N个人,M个团体.每个人有属于自己的一些团体编号.将每个人分配到自己属于的团体中,问这个人数最多的团体其人数最小值是多少. 分析:一个一对多的二分图匹配,且是最大值最小化问题.二分图的多重匹配建 ...

  8. [USACO2003][poj2112]Optimal Milking(floyd+二分+二分图多重匹配)

    http://poj.org/problem?id=2112 题意: 有K个挤奶器,C头奶牛,每个挤奶器最多能给M头奶牛挤奶. 每个挤奶器和奶牛之间都有一定距离. 求使C头奶牛头奶牛需要走的路程的最大 ...

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

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

随机推荐

  1. JSP EL

    一.JSP EL语言定义 E L(Expression Language)  目的:为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 ...

  2. POJ1671 动态规划

    POJ1671 问题重述: 本题求解一首N行诗可能的押韵结构的数目.所谓押韵结构,指的是指定的行数之间必须押韵.例如一首3行诗的押韵结构可以是aaa, aab, aba, baa, abc 5种(aa ...

  3. 利用程序将.jrxml导出为.jasper文件并用PDF显示(2)

    直接在Web项目中使用.jasper文件,其实在软件项目开发时,.jrxml文件经常修改,而且.jrxml还要在项目中进行保留备份,所以较为流行的做法是在项目中使用.jrxml来生成.jasper文件 ...

  4. Office2007设置无格式粘贴

    打开Word 2007,按Alt+F11.这时会出现一个Visual Basic编辑窗口.如图所示:   上图中左上方,鼠标右击Normal→插入→模块,出现下图:     双击"模块1&q ...

  5. SqlServer计算周岁的函数

    CREATE Function Dbo.GetAge ( @birthday datetime, @now datetime ) Returns int As Begin Declare @Age i ...

  6. C语言开发CGI程序的简单例子

    这年头用C语言开发cgi的已经不多,大多数的web程序都使用java.php.python等这些语言了. 但是本文将做一些简单的cgi实例. 首先配置环境 #这里是使用的apache AddHandl ...

  7. 【HDU1879】继续畅通工程(MST基础题)

    真心大水题...不多说. #include <iostream> #include <cstring> #include <cstdlib> #include &l ...

  8. Linux 文件系统同步

    同步就是将物理内存中dirty的页写入到磁盘中,保证磁盘和物理页之间的内容一致. 触发同步操作的时机: 1.周期性内核线程,扫描脏页,根据一定的规则选择脏页,将页写回到磁盘. 2.如果内核中的脏页过多 ...

  9. js相对定位

    效果图:

  10. pyqt最小化学习

    # -*- coding: cp936 -*- #!/usr/bin/env python # -*- coding:utf-8 -*- from PyQt4 import QtCore, QtGui ...