查找不包含负循环的强连通子图
Posted
技术标签:
【中文标题】查找不包含负循环的强连通子图【英文标题】:Finding strongly connected subgraph that contains no negative cycles 【发布时间】:2020-04-19 10:31:36 【问题描述】:是否有解决以下决策问题的算法:
给定由其转移矩阵定义的强连通加权有向图G
,是否存在没有负循环的G
的强连通跨越子图?
G
的强连通跨越子图是 G
的强连通子图,它与 G
共享相同的顶点。您可以查看此paper 以了解强连通跨越子图的定义。在本文中,他们提出了最小强连通子图问题的近似值。
解决这个问题的一种简单方法是使用 Ford-Bellman 或 Floyd-Warshall 算法找到图的负循环,从该循环中删除一条边,并在图仍然强连接时重复。但是这种简单的方法时间复杂度很差,因为我们可能会运行 Ford-bellman 算法并多次检查强连通性——而且我无法证明该算法是否在所有情况下都是正确的。
我希望在这里找到专家,他们可以告诉我这个决策问题是否可以在多项式时间内解决,以及什么算法可以解决。非常感谢。
【问题讨论】:
你的意思是最大子图吗?最小子图可以是两个节点和两条边;) @karmakaze 这个问题确实是'那里有......',我编辑它。 [不是专家] 只是头脑风暴,也许你可以通过 Tortoise 和 Hare 检测周期,修改为存储从起点开始的总重量,如果你到达一个已经分配的节点,那么你有一个周期并且当前总重量和分配的差异将表明是否为负。动态编程可能会限制您需要使用的起点数量。每次新的起点运行都需要清除分配。 您没有解决@Yonlif 的评论。 G:A->B, B->A 是一个强连通图。这样的子图在这个问题中可以接受吗? @othmanmarfoq 将所有定义和标准添加到问题正文通常是个好主意。至少将这些基本定义(和必要的链接)添加到问题正文中,以便将来遇到相同问题的其他人可以跟进。 【参考方案1】:这是一个简单的解决方案,它有合理的机会找到一个在多项式时间内没有负循环的强连接跨越子图。但强调不保证能找到。
把所有的权重都变成负数。现在使用 Ford-Bellman 或 Floyd-Warshall 来寻找负循环。这实际上是原始图中的一个正循环。
现在我们在循环中选择一个顶点,并将其他顶点收缩到它。 连接到/从已删除顶点的边被代表沿着该边并围绕循环移动到我们保留的那个的边替换。如果在两个顶点之间出现多条边,则只保留最好的一条。
在新的更小的图表上重复练习。
该算法在保证多项式时间内运行(每次迭代都在多项式时间内运行并删除至少一个顶点)。如果它设法将您的图减少到一个点,那么您只需将过程倒退并发现您实际上已经找到了一个没有负循环的强连通跨越图。
但是,如果它没有这样做,则不能保证没有。你只是没有找到它。
(我怀疑有保证的算法将是 NP 完全的。)
【讨论】:
感谢您的回答,唯一的问题是问题是关于找到一个与 G 共享相同顶点的子图,即顶点集应该保持不变。如果我很了解您的方法,它包括在每次迭代中减少顶点数量,不是吗?【参考方案2】:这个问题通常是 NP 难的,这可以通过将哈密顿循环减少到其中来证明。
【讨论】:
以上是关于查找不包含负循环的强连通子图的主要内容,如果未能解决你的问题,请参考以下文章
UVALIVE 4287 Proving Equivalences (强连通分量+缩点)