当前位置: 首页 > 知识库问答 >
问题:

在一个DFS中求双图的强连通分量

白子默
2023-03-14

到目前为止,我已经使用了下面的算法来寻找图的强连通分量。

>

  • 调用DFS(G)计算每个顶点v的完成时间F[v],对G的顶点按完成时间递减的顺序排序;

    计算G的转置GT;

  • 共有1个答案

    桓喜
    2023-03-14

    请看,史蒂文·斯基纳的算法设计手册。它在一个DFS中计算SCC。它基于最老可达顶点的概念。

    一开始就初始化每个顶点的可达顶点和scComponent#。

    low[i] = i;
    scc[i] = -1;
    

    在有向图上做一个DFS,你只对后边缘和交叉边缘感兴趣,因为这两个边缘会告诉你是否遇到了后边缘,并从另一个分量中输入了一个分量。

      int edge_classification(int x, int y)
      {
        if (parent[y] == x) return(TREE);
        if (discovered[y] && !processed[y]) return(BACK);
        if (processed[y] && (entry_time[y]>entry_time[x])) return(FORWARD);
        if (processed[y] && (entry_time[y]<entry_time[x])) return(CROSS);
         printf("Warning: unclassified edge (%d,%d)\n",x,y);
      }
    
    if (class == CROSS) 
    {
                if (scc[y] == -1)  /* component not yet assigned */
                        if (entry_time[y] < entry_time[ low[x] ] )
                                low[x] = y;
    }
    
    process_vertex_early(int v)
    {
        push(&active,v);
    }
    
    if (low[v] == v) 
    {     /* edge (parent[v],v) cuts off scc */
              pop_component(v);
    }
    
    if (entry_time[low[v]] < entry_time[low[parent[v]]])
              low[parent[v]] = low[v];
    
     类似资料:
    • 我在读关于BFS和DFS的图算法。当我在分析用DFS寻找图中强连通分量的算法时,我产生了一个疑问。为了寻找强连通分量,book(Coremen)首先在图上运行DFS,以得到顶点的完成时间,然后在图的转置上按照第一个DFS得到的完成时间的递减顺序运行DFS。但是我不能理解为什么第二个DFS必须按照完成时间运行。我的意思是,即使我们直接在图的转置上运行DFS(忽略完成时间),它也会给我们连接的组件吗?

    • 我正在努力自学图论,现在试图理解如何在图中找到SCC。我读过关于SO的几个不同的问题/答案(例如,1、2、3、4、5、6、7、8),但我找不到一个可以遵循的完整的一步一步的例子。 根据CORMEN(算法导论),一种方法是: 调用DFS(G)计算每个顶点u的完成时间f[u] 计算转置(G) 调用DFS(转置(G)),但在DFS的主循环中,按F[u]递减的顺序考虑顶点(如步骤1中计算的那样) 输出步骤

    • 我想在无向图中找到一个强连通分量,即如果我从一个节点开始,那么我将回到节点,并且每个边都被精确地访问一次。 对于有向图,可以用Tarjan算法求强连通分量,但是对于无向图,该怎么办。

    • 我有一个强连通图。我想移除一个边并检查是否仍然保持强连接。因为我将N=图中节点的总数取为10,并且我感兴趣的大多数图都有25条以上的边,所以很难检查一次使用一条,去掉边。 如何解决这个问题?多谢了。

    • 输出应该如下所示: 我甚至不知道为什么会有这样的错误。我将代码从https://www.geeksforgeeks.org/tarjan-algorithm-find-strong-connected-components/改为我的代码,并添加了input机会。我问过这个问题,一个朋友说:“这是addEdge方法中添加w后的两个代码的输出,在您的代码中w添加到所有元素中,而在原始代码中只添加到图V

    • 我不太确定这是不是解决办法,有人能帮我弄清楚吗? 谢谢!