使用包含给定节点集的节点数最少的节点确定具有额外条件的图

时间:2012-06-09 18:50:18

标签: graph-theory graph-algorithm

我有一个未加权的有向图,可能有也可能没有循环。现在给定一组节点,我需要返回一个具有给定节点和最小节点数量的图形,以便它们连接起来。我不能创建新的边缘,所以我需要使用现有的边缘。

希望这些照片清楚地表明。从图表开始,

enter image description here

假设我们想要具有节点c,f和g的图形,该函数将返回该图形 enter image description here

然而,还有一个条件。每个边都有一个名为required的布尔变量。如果将此设置为true,则此边缘和相应的节点也需要包含在图形中。

这是另一张图片来说明 不需要黑色边缘​​,但需要红色边缘 假设我们给a和c作为要包含的节点。

enter image description here

因此,不要返回A-> C的图表, 它将返回此

enter image description here

为了使这一点更加清晰,如果我们想要一个带有b和c的图形,它也会返回该图形,因为该边缘是必需的。

如何返回此图表?我宁愿没有返回循环的图表,但我意识到这并不总是可行的,因为循环的边缘可能都被标记为必需。

我最初的想法是将图形的副本保留在所需的边缘上,然后尝试将不相交的图形拼凑回来。但是在我将图形重新组合在一起的所有尝试中,我能够找到一个反例,显示它不是最小图形。

1 个答案:

答案 0 :(得分:1)

第一个示例中的预期输出是否包含节点e,其他所有节点都可以到达?或者你的意思是弱连接(意味着边缘的方向无关紧要)?我猜第二种情况就是这种情况(从你的A,B,C例子来看),然后你可以

  1. 忽略边缘是直接的(线性时间),
  2. contract“必需”边缘(线性时间),
  3. 在所需点的子集上计算pairwise shortest paths(O(| V |³)但我想你可以把它推到O(r | V |²),其中r是所需点的数量) ,然后
  4. 在所需的点(O(r²))
  5. 上找到minimum spanning tree

    这就是你想要的吗?