根据CLRS第3版的定义,单连通有向图是指每对顶点(u,v)至多有一条唯一的路从u->v来的图。现在我读过的大多数答案都说,我们从图中的每个顶点运行DFS,如果在任何情况下我们找到一条交叉边或一条前向边,那么图就不是单连通的。我可以理解前向边的概念,但是在这个图上运行这个algo
1-->2<--3将给出一个结果:它不是单连通的,而这个图是单连通的。我们有一个从3->2或1->2的交叉边,这取决于从哪个vertext开始整个过程(1或3)。如果我们从顶点2开始DFS,那么我们有2条交叉边1->2和3->2。谁能澄清一下吗?
建议从每个节点运行DFS的答案意味着,一旦无法继续(没有留下输出边),就应该停止DFS,而不是从不同的节点开始。
在这种情况下,在您的示例中,您将从1开始(w.l.o),发现2,您就完成了。No back edgees
下一个,是一个全新的DFS,从3开始,发现2,并且完成,再次没有back edge。
这个想法基本上是通过定义来验证属性。从每个节点u
执行一个DFS,直到您发现对于每个v
最多有一个从u
到v
的路径(DFS已耗尽),或者您在某个点找到从u
到v
的第二个路径,然后您就完成了。
考虑一个不连通的有向图的例子,其中顶点和边其中顶点是孤立的。 根据这里的答案:(对强连通图的最小加法),保证这个图所需的最小边数结果是3。 如何找到将这些边添加到哪里,即图中一条边的起始点和终止点?
null 更新:最多1个简单路径。
我在NetworkX中有一个有向无环简单图。 现在,对于每个边,该边都有一个“源”和一个“目标”。如果除了这个边之外,还有一条从“源”到“目标”的路径,那么我想删除这个边。 null > 节点为: 边缘是:
很明显,在图中不应该有任何交叉边或前向边。但是后缘呢?