分配组

问题描述

我在将变量分配给集合时遇到问题。每个集合都有一个可以分配给它的变量限制,每个变量可以分配给总集合的某些子集。

示例:

  • a可以位于AB
  • 组中
  • b可在集合B
  • c可以位于AB
  • 组中
  • d可在集合A

因此,我们可以有A: a,d; B: b,cA: c,d; B: a,b(集合中变量的顺序无关紧要)/

当然,有时无法分配所有变量,有时有多个选项,有时只有1个选项。

我觉得这个问题有一个简单的版本,但是我似乎没办法。任何指针将不胜感激。

解决方法

使用最大流量可有效解决。准备一个流动网络,从源到每个变量的单位容量弧,从每个变量到它可以归属的每个集合的单位容量弧,以及从每个集合到容量池的弧等于该集合的容量的弧。例如,

ARCS

tail head capacity
------------------
s    a    1
s    b    1
s    c    1
s    d    1
a    A    1
a    B    1
b    B    1
c    A    1
c    B    1
d    A    1
A    t    2
B    t    2

使用您喜欢的最大流量算法,该算法会产生积分流,并根据设置圆弧具有流量的变量提取分配。

,

此问题是NP完全的,这意味着没有多项式时间解。 在这种情况下,您将不得不使用回溯。

看看这些链接:

https://www.geeksforgeeks.org/vertex-cover-problem-set-1-introduction-approximate-algorithm-2/ https://www.geeksforgeeks.org/set-cover-problem-set-1-greedy-approximate-algorithm/