我正在完成一项任务,其中一个问题要求推导出一种算法来检查有向图G=(V,E)是否为单连通(对于所有不同的顶点u,v,从u到v最多只有一条简单路径)。
当然,您可以采用暴力方式进行检查,这也是我目前正在做的事情,但我想知道是否有更有效的方法。有谁能指点我一下吗?
我正在完成一项任务,其中一个问题要求推导出一种算法来检查有向图G=(V,E)是否为单连通(对于所有不同的顶点u,v,从u到v最多只有一条简单路径)。
当然,您可以采用暴力方式进行检查,这也是我目前正在做的事情,但我想知道是否有更有效的方法。有谁能指点我一下吗?
你尝试过 深度优先搜索(DFS) 吗?
Run DFS for every vertex in the graph as source
If a visited vertex is encountered again, the graph is not singly connected
repeat for every unvisited vertex.
The graph is singly connected.
复杂度为O(v^2),o(v) dfs,因无重复。
我不同意它的复杂度会是O(V^2),因为在DFS中,我们并不像算法导论书中所说的那样为每个顶点调用它,语法是DFS(G)。我们只为整个图调用DFS,而不是单个顶点,不像BFS。因此,在这种情况下,根据我的理解,我们只需要调用一次DFS来检查它。如果再次遇到已访问的顶点,则该图不是单连通的(当然,对于每个不连通的组件,我们必须调用它,但它已经包含在代码中)。因此,复杂度将是O(V+E)。由于E=V,因此复杂度应该是O(V)。
看一下简单路径的定义。循环图可以是单连通的。DFS
对于 A->B, B->A
这种单连通的情况无法工作。
以下论文使用强连通分量来解决这个问题。
从每个顶点运行一次深度优先搜索。当且仅当一个连通分量内没有前向边和交叉边时,图形才是单连通的。
复杂度:O(V.E)