我有一个权重未知、连通的图。我想找到一个包括特定节点集合的连通子图,且尽可能少地包含其他节点。如何实现呢?
为了更准确地表达问题,设G(V,E)为一张权重未知、无向、连通的图,N是V的某个子集。如何找到G(V,E)的最小连通子图G'(V',E'),使得N是V'的子集?
逼近解也是可以的。
为了更准确地表达问题,设G(V,E)为一张权重未知、无向、连通的图,N是V的某个子集。如何找到G(V,E)的最小连通子图G'(V',E'),使得N是V'的子集?
逼近解也是可以的。
这正是众所周知的NP-hard 斯坦纳树问题。如果没有更多关于您实例的详细信息,很难就适当的算法给出建议。
为所需的节点 N
创建一个minimal vertex-cover。
将这些可能不相连的子图合并成“大”节点。也就是说,对于每个子图,从图中删除它,并用一个新节点替换它。将这组节点称为 N'
。
对 N'
中的节点进行最小顶点覆盖。
“解压缩” N'
中的节点。
正如已经指出的那样,这是图中的斯坦纳树问题。然而,一个重要的细节是所有边的权重都应该为1。因为对于任何斯坦纳树(V',E'),|V'| = |E'| + 1,这正好实现了你想要的目标。 为了解决这个问题,我建议使用以下斯坦纳树求解器(透明度:我是其中之一的开发人员):
对于具有数千条边的图形,通常可以在不到0.1秒的时间内获得最优解。