枚举任意图形中两个顶点之间的所有简单路径通常需要指数时间,因为顶点之间可能存在指数个简单路径。但是,如果我们只对两个端点之间的至少一条简单路径上的顶点感兴趣呢?
那就是:给定一个无向图和两个不同的顶点,是否有一个多项式时间算法,它找到两个顶点之间至少有一条简单路径的每个顶点?这不是与连通性相同;死胡同和死胡同被排除在外。但是,分支和连接路径是允许的。
我发现编写一个看起来像是解决了这个问题的算法非常容易,但在某些情况下要么失败,要么在病态情况下需要指数运行时间。
更一般地说:给定图中两个不相交的顶点集,是否存在多项式时间算法,该算法可以找到位于从一个集合中的顶点到另一个集合中的顶点的简单路径上的所有顶点?
(请原谅我,如果有一个非常明显的解决方案。当然感觉应该有。)
答案 0 :(得分:14)
这是一个线性时间确定性解决方案。在两个端点之间插入一条边(我们称之为a和b),如果这样的边不存在,则将问题转化为找到最大的顶点集v的问题,它位于通过a和b的任何简单循环上。你可以说服自己这样一个集合对应于包含a和b的最大子图,它不能通过删除任何节点(也称为双连通组件)来断开连接。 This page描述了Hopcroft和Tarjan的概念和经典线性时间(基于DFS)算法,以识别所有双连通组件(您只需要包含a和b的组件)。
关于两个集合之间的简单路径的第二个问题(让我们称之为A和B)可以通过创建一个新的顶点a,边缘到A中的所有顶点,以及一个顶点b,边缘到所有顶点,可以简化为第一个问题B,然后解决你的第一个问题a和b。
答案 1 :(得分:1)
你介意一个概率解决方案吗?也就是说,它不能保证找到所有顶点,但它通常首先尝试,并且绝大多数可能在2或3次尝试之后?
如果你没关系,可以随机为每个边缘分配一个电阻,如果你把电源放在1的电压,接收器的电压为0,则求解每个节点的电压。连接它的节点处于不同的电压显然是在一条简单的路径上(路径很容易构建,只是从一端经过上升电压,从另一端下降)。连接它的两个节点处于相同电压的边缘非常不太可能在一条简单的路径上,尽管理论上可能会发生这种情况。
重复几个随机分配的阻力组,你绝对有可能找到简单路径上的所有边。 (你还没有证明这个答案,但错误的可能性很小。)
当然,一旦你知道了简单路径上的所有边缘,获得简单路径上的所有顶点都是微不足道的。
<强>更新强>
我相信以下是正确的,但没有证据。假设我们采取一组电阻并计算出电压。对于处于简单路径中的每个边缘,存在另一边缘(可能相同),使得仅改变该边缘的电阻将导致第一边缘上的电压变化。如果是这样,则可以在多项式时间内识别简单路径中的每个边缘。
直观地说,这对我有意义,但我不知道如何证明它。