我正在进行一项任务,其中一个问题是要求派生算法来检查有向图G =(V,E)是否是单独连接的(对于所有不同,最多只有一条从u到v的简单路径顶点u,v,V。
当然你可以强行检查它,这就是我现在正在做的事情,但我想知道是否有更有效的方法。有人能指出我正确的方向吗?
答案 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
。
以下论文使用强连接组件来解决此问题。
答案 6 :(得分:-1)
从每个顶点运行一次DFS。如果和,图表是单独连接的 只有当没有前沿并且a内没有交叉边时 成分
复杂性:O(V.E)