确定有向图是否单独连接的最有效方法是什么?

时间:2010-03-24 20:50:40

标签: algorithm adjacency-list directed-graph

我正在进行一项任务,其中一个问题是要求派生算法来检查有向图G =(V,E)是否是单独连接的(对于所有不同,最多只有一条从u到v的简单路径顶点u,v,V。

当然你可以强行检查它,这就是我现在正在做的事情,但我想知道是否有更有效的方法。有人能指出我正确的方向吗?

7 个答案:

答案 0 :(得分:5)

这个问题有一个更好的答案。你可以在O(| V | ^ 2)中做到这一点。你可以在线性时间内付出更多的努力。

首先,在每个强组件中找到G.的强连接组件,搜索以查找此案例: 1)如果该组件中存在前沿,则它不是单独连接的, 2)如果该组件中存在交叉边缘,则它不是单独连接的, 3)如果树中至少有两个后缘位于顶点u,对于u的正确祖先,则它不是单独连接的。

这可以在O(E)中完成。 (我想除了案例3.我无法很好地实现它!)。

如果上述情况均未发生,则应检查G ^ SCC上是否存在交叉边缘或前沿(图G,强组件替换为单个节点),因为我们没有后备,它可以通过在O(| V | ^ 2)中重复该图的每个顶点上的dfs来完成。

答案 1 :(得分:4)

您是否尝试过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为无重复。

答案 2 :(得分:3)

阅读this one。它真的很好地解释了。

答案 3 :(得分:0)

我不同意它的复杂性将是O(V ^ 2),因为在DFS中我们不会为每个顶点调用它,如算法手册简介中所见,语法是DFS(G)。与BFS不同,我们只为整个图调用DFS而不是任何单个顶点。所以在这种情况下,根据我的情况,我们必须通过调用DFS一次来检查它。如果再次遇到访问的顶点,图形不是单独连接的(我们必须为每个断开连接的组件调用它,但它已经包含在代码中)。所以复杂性将是O(V + E)。因为这里E = V因此复杂性应该是O(V)。

答案 4 :(得分:0)

我想到了这个: 1)从任何顶点运行DFS,如果所有顶点都被DFS覆盖而没有前沿(可能没有交叉,否则不会覆盖所有顶点),那么它可能是潜在的候选者。

2)如果在DFS中找到的顶点(级别j)具有到i级的后边缘,那么在它之后找不到其他顶点应该具有朝向任何具有小于j的顶点的后边缘并且每个顶点都是可到达根目录(使用第二个DFS检查)。

如果这是正确的,它会以线性时间进行。

答案 5 :(得分:0)

看一下简单路径的定义。循环图可以单独连接。 DFS不适用于单独连接的A->B, B->A

以下论文使用强连接组件来解决此问题。

https://www.cs.umd.edu/~samir/grant/khuller99.ps

答案 6 :(得分:-1)

从每个顶点运行一次DFS。如果和,图表是单独连接的 只有当没有前沿并且a内没有交叉边时 成分

复杂性:O(V.E)