【发布时间】:2012-06-05 05:12:58
【问题描述】:
枚举任意图中两个顶点之间的所有简单路径通常需要指数时间,因为顶点之间可能存在指数数量的简单路径。但是,如果我们只对两个端点之间至少一条简单路径上的顶点感兴趣呢?
也就是说:给定一个无向图和两个不同的顶点,是否有一个多项式时间算法可以找到两个顶点之间至少一条简单路径上的每个顶点?与连接性相同;死胡同和死胡同被排除在外。但是,允许分支和连接路径。
我发现编写一个看起来可以解决这个问题的算法非常容易,但在某些情况下会失败,或者在病态情况下需要指数级的运行时间。
更一般地说:给定图中的两个不相交的顶点集,是否有一个多项式时间算法可以找到位于从一组顶点到另一组顶点的简单路径上的所有顶点?
(如果有一个非常明显的解决方案,请原谅我。感觉当然应该有。)
【问题讨论】:
-
您可以针对第一个问题修改 Floyd-Warshall。这是n^3。只需在您穿过顶点时跟踪顶点,然后查看哪些其他顶点同时具有到目标和源的路径。
-
您应该考虑将此类问题发布到新的computer science stackexchange 站点。
-
@JanGorzny- 这种方法的问题在于,它只会告诉您子图中是否有 最短 路径通过这些节点。我可能在某些子图中的非最短路径上有一个节点会被跳过。
-
@templatetypedef 但是你可以循环遍历所有节点(假设你有一个列表,在节点大小的线性时间内)并检查每个节点是否有一些最短路径(并且你可以排除其中至少一条路径使用两个指定节点的情况——尽管这需要存储大量信息)。最终我承认它并不完美,但我认为这可能是一个起点!
-
当然,任何两端问题的多项式时间解决方案都意味着 N 端问题的多项式时间解决方案,因为您可以将两者中所有顶点对的结果合并套。我的问题只要求多项式时间,而不是渐近最优的。不过,对于 N 端可能会有更快的算法。
标签: algorithm language-agnostic graph depth-first-search breadth-first-search