二维矩阵问题——有多少人能得到他们想要的颜色?

2D Matrix Problem - how many people can get a color that they want?

给定如下的位数组:

                      
         C0      C1      C2      C3     C4      C5
      **********************************************
   P0 *  0       0       1       0       1       0 *
   P1 *  0       1       0       0       1       0 *
   P2 *  0       0       0       1       1       0 *
   P3 *  1       0       0       0       0       1 *
   P4 *  0       0       0       0       0       0 *
   P5 *  0       0       0       0       0       0 *
   P6 *  1       0       0       0       0       0 *
      **********************************************

每一行代表不同的人 P_i,而每一列代表不同的颜色 C_j。如果给定的单元格 A[i][j] 为 1,则表示人 i 想要颜色 j。一个人只能得到一种颜色,一种颜色也只能给一个人。

总的来说,人数P>0,颜色数C>=0。

我怎样才能省时地计算出可以得到他们想要的颜色的最大人数?

上面例子的正确答案是 5。

  1. 人6(P6)只有一个愿望,所以他得到颜色0(C0)
  2. 既然C0被拿走了,P3只剩下一个愿望了,所以他得到了C5。
  3. P0 得到 C2,P1 得到 C1,P2 得到 C3。

我的第一个想法是一个贪心算法,它只偏爱所需颜色最少的人(即行)。这在大多数情况下都有效,但对我来说太慢了,因为它在 O(P*(P*C)) 时间内运行,当 n = P = C 时等于 O(n^3)。任何关于可以更快解决问题的算法(或其他数据结构)的想法?

这可能与另一个类似问题重复,但我无法找到问题类型的正确名称,如果是这种情况,请多多包涵。

这是一个经典问题,称为最大基数二分匹配。在这里,您有一个二部图,其中一侧有对应于人的顶点,另一侧有对应于颜色的顶点。如果矩阵中相应的条目中有一个,则存在人和颜色之间的边。

在一般情况下,最著名的算法在最坏情况下的性能为 O(E*sqrt(V)),其中 E 是图中的边数,V 是顶点数。一种这样的算法称为 Hopcroft-Karp。我建议您阅读我链接的维基百科解释。