【问题标题】:Partitioning a graph into connected subgraphs with sets of vertices that must be in the same subgraph将图划分为连接的子图,其中的顶点集必须在同一个子图中
【发布时间】:2011-07-26 13:18:31
【问题描述】:

我有一个连通的无向图 G = (V, E),一个集合 S = {S_1, S_2,..., S_n},其中每个 S_i 是 V 的子集,并且 k > 1。我怎么能将 V 划分为 k 个子集,从而保证:

  1. 对于每个 i,S_i 中的每个节点都在同一个子集中
  2. 每个子集代表 G 的一个连通子图?

【问题讨论】:

  • 属于 math.stackexchange.com
  • 是预先固定的数字k还是取决于解决方案?
  • 我假设 S_i 是分离的?我猜n>k?
  • 还有不属于任何 S 的顶点吗? (如果没有,你的生活就会变得更轻松;)

标签: algorithm graph


【解决方案1】:

施泰纳森林问题是,给定一个加权图 G = (V, E) 和顶点对 (s1, t1), ..., (s m, tm),找到 G 的最轻边子图 H 使得对于所有 i,顶点 si 和 ti 属于 H 的同一个连通分量。

问题的决策版本本质上是具有单位权重的施泰纳森林的决策版本。不幸的是,这种特殊情况仍然是 NP 难的。

从施泰纳森林的特殊情况到您的问题的简化是,给定施泰纳森林的未加权实例和确定是否存在最多 c 的解决方案的指令,使用相同的图创建您的问题的实例, k = |V| - c,并且对于所有 i,令 Si = {si, ti}。如果存在一个成本最多为 c 的 Steiner 森林,则森林的连通分量是您的子集,其数量至少为 |V| - c = k。相反,如果您的问题实例有解决方案,那么我们可以在您的每个子集中找到一个生成树,并且总成本最多为 |V| - k = c。

已知的最佳近似比率是 2,如果 k 很小,这对您没有多大帮助。您可能必须使用分支和绑定。

【讨论】:

  • 检查每个 S_i 是否是连通子图(否则问题无解)。 不正确:考虑实例 V = {1, 2, 3, 4, 5 } 和 E = {{1, 2}, {2, 3}, {3, 4}, {4, 5}} 和 S1 = {1, 3} 和 S2 = {2, 4} 和 S3 = {5 } 和 k = 2。S1 和 S2 都没有导出连通子图,但解 {{1, 2, 3, 4}, {5}} 是有效的。
  • 您的答案看起来像是人们在那些时刻寻找的理论推导类型。问题是我不明白。成本在哪里起作用?
  • @Nicolas78 这里的“成本”是森林中的边数。我可能应该说“总重量”,以免混淆隐喻——CS对此很糟糕。适用于森林的关键方程是#components + #edges = #vertices。 Steiner 森林解决方案的效率以边缘来衡量,而该问题的解决方案的效率以组件(= 连接子集)来衡量。
【解决方案2】:

一些随机观察。 您可能无法连接两个 S_i、S_j,因为它们不形成连通子图。由于图是连接的,如果您只需添加足够多的其他 S_k,您始终可以连接它们 - 最终您将得到按定义连接的完整图。因此,连接性要求驱使您走向合并。然而,对 k 个子集的要求驱使您将事物分开。基本上,你有一个 n^k 搜索空间,如果你跟踪这些条件,你可以彻底修剪它。当然,如果您在任何 S 中都有“免费”节点,那将彻底改变游戏规则。

是的,这不是一个真正的答案,而是一个开始。无论如何都会发布;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多