Algorithm 有向图的所有顶点都存在路径吗?
给定G,一个有向图,是否有一条路径(不一定是简单路径)穿过G中的所有顶点 我首先需要检查无环图和强连通图中发生了什么,然后使用强连通分量图为一般图找到一个解决方案 到目前为止,我已经发现,对于强连通图,总是有一条路径。对于非循环图,如果有多个源,则路径将永远不存在。此外,如果存在一个D out大于1的顶点,则路径将永远不存在Algorithm 有向图的所有顶点都存在路径吗?,algorithm,directed-graph,Algorithm,Directed Graph,给定G,一个有向图,是否有一条路径(不一定是简单路径)穿过G中的所有顶点 我首先需要检查无环图和强连通图中发生了什么,然后使用强连通分量图为一般图找到一个解决方案 到目前为止,我已经发现,对于强连通图,总是有一条路径。对于非循环图,如果有多个源,则路径将永远不存在。此外,如果存在一个D out大于1的顶点,则路径将永远不存在 问题是,我不确定最后一个是正确的,如果它是错误的,我的算法是错误的。最后一个假设是不正确的,例如,看看图G=(V,E),其中E={(V_I,V_j)| I1[假设|v|>3
问题是,我不确定最后一个是正确的,如果它是错误的,我的算法是错误的。最后一个假设是不正确的,例如,看看图
G=(V,E)
,其中E={(V_I,V_j)| I
图显然是一个DAG。因此,找到最大强连通分量不会改变图。另外-图有一个哈密顿路径,但是d_out(v_1)>1
[假设|v|>3
]
然而,你在正确的轨道上
高级伪代码中的算法:
如果存在这样一条路径,则将其设为
v0->v1->…vm
。
让我们把
V_i
表示为V_i
所在的最大强连通分量。
现在,对于原始图形
v0->v1->…->vm
中的路径,MSCC图形2中也有一条路径:V_0->V_1->…->V_m
。
请注意,如果
V_i
在上述路径中出现两次[或更多]——这两种情况彼此相邻,否则发现的MSCC不是最大的,因为如果V_i->V_k->…->V_i
是可行路径——那么V_i和V_k不是最大的,因为可以将它们合并成一个更大的SCC。
现在,对于每一个
V_i
将所有发生的事情折叠成一个,你就得到了一条路径-每个V_i
最多出现一次[我们刚刚说明了原因],而恰恰是一个[因为每个V_i
都在原始路径上,我们没有完全删除MSCC的-只是折叠它们]。
因此,生成的路径是MSCC图中的哈密顿路径 建议公式正确性证明:
因为我们显示了MSCC图中的哈密顿路径存在当且仅当原始图中存在请求的路径-那么:
->
算法返回true->算法在DAG中找到一条哈密顿路径->在DAG中有一条哈密顿路径[foot note 1]->在原始图形中有一条请求的路径。
算法没有在DAG中找到哈密顿pat->DAG中没有哈密顿路径[脚注1]->原始路径中没有请求的路径 Q.E.D.
1:在DAG中,如果存在哈密顿路径,则存在唯一的拓扑排序,如果存在哈密顿路径,则是拓扑排序中顶点的顺序。因此,在DAG中,找到哈密顿路径是很容易的。
2:实际上,这是一个小小的修改,
V_i->V_i
在MSCC图上并不是一条真正的边,但现在让我们把它表示为一条边。你是在问如何解决这个问题吗?或者,如果最后一个假设是正确的[提示:它不是,例如,E={(v_i,v_j)|i
,有这样的顶点,d_out(v)
>1,并且仍然有一条路径穿过所有顶点-甚至是哈密顿路径]是的,我不确定最后一个,你确认了。。所以我现在需要一些帮助谢谢你的回答。。。但是哈密顿路径不一定是一条简单的路径吗???@Nusha:是的,但我要说的是,在DAG中有一条哈密顿路径,代表图的MSCC,而不是图本身。MSCC图中的哈密顿路径意味着原始图上所有顶点的路径。@Nusha:我添加了更详细的解释[和证明]来说明算法的正确性。