如何获得在图中将某个节点彼此断开连接的最小成本
Posted
技术标签:
【中文标题】如何获得在图中将某个节点彼此断开连接的最小成本【英文标题】:How to get the minimum cost of disconnecting some node from each other in a graph 【发布时间】:2012-05-06 03:36:21 【问题描述】:在给定的图中,我想计算在图中断开某个节点的最小成本。示例: 在此图中,假设我想通过删除这些节点之间的一些边来断开 node A
、node C
和 node F
彼此的连接。即通过删除edge A-B
和edge F-E
,节点A
、C
和F
将断开连接。这里的成本是指被移除的边缘的长度。在此示例中,将Node A
、Node C
和 Node F
彼此断开的总最小成本为 2+1=3。
有人可以提供一些提示。我无法对这个问题进行分类,这是shortest path problem
还是minimum spanning tree problem
?
【问题讨论】:
我认为,唯一的办法就是暴力搜索。 @Anton:请不要这么说:(。我无法想象我的生活是蛮力的。 【参考方案1】:这称为多终端切割问题。不幸的是,似乎没有***条目。问题是,给定一个加权图和一个称为终端的顶点子集,计算边的最小权重集,其移除会断开每对终端的连接。坏消息是这个问题是 NP 难的,所以如果你真的需要一个不能被暴力破解的实例的最优解,你可能不得不求助于整数编程。好消息是有一个简单的 2 逼近算法(不是已知的最佳因子,但您可能需要复习线性规划并阅读研究文献以使用“更好”的),这可以通过采取st 切割的联合将每个终端与其他终端分开。
【讨论】:
Karger 的算法在这里不起作用,因为它(希望)给出了全局切割,而不是分开两个特定顶点的切割。 我应该从哪里开始? 嗯,这取决于您的实例有多大以及您对最佳解决方案的渴望程度。 我的图是一个大图,最多有 100,000 个节点。 这是一个非常大的实例,所以我建议您进行近似。复杂的部分是计算 s-t 最大流量/最小削减。 Andrew V. Goldberg 有一个他的 push-relabel 算法的有效实现,但它是用 C 编写的。我不确定是否有人将它移植到 Java。算法本身在 Goldberg 与 Robert Tarjan 的 JACM 论文中进行了描述,而在 Cherkassky-Goldberg 中的启发式方法进行了描述。近似算法归功于 Dahlhaus 等人,并且在 Williamson 和 Shmoys 关于近似算法的文本中有很好的描述。以上是关于如何获得在图中将某个节点彼此断开连接的最小成本的主要内容,如果未能解决你的问题,请参考以下文章