使用邻接表检查有向图是否强连通

Check if directed graph is strongly connected using adjacency list

我需要查明给定的邻接表 (int[][]) 是否描述了强连通图。 我在图中有超过 2 个节点的一些测试用例失败了。 例如 adjlist = new int[][] {{ 1 },{ 2 },{ 0 },};这意味着节点 0(列表中的第一个)可以连接到节点 1,节点 1 可以连接到节点 2,节点 2 可以连接到节点 0。 我试过这个:

 public boolean allDevicesConnected(int[][] adjlist) {
     Boolean[] visited = new Boolean[adjlist.length];
     for (int i = 0; i < adjlist.length; i++) {
         for (int b = 0; b < visited.length; b++) {
             visited[b] = false;
         }
         DFS1( adjlist, i, visited);
     }
        for (int j = 0; j < visited.length; j++) {
            if (visited[j] == false) {
                return false;
         }
     }   
     return true;
}
 
 private static void DFS1(int[][] adjlist, int v, Boolean[] visited) {
    visited[v] = true;
    for (int i = 0; i < adjlist[v].length; i++) {
        if (visited[i] == false) {
            DFS1(adjlist, i, visited);
        }
    }
}

如有帮助将不胜感激!!

你的想法是使用深度优先搜索,同时将节点标记为已访问以确定是否强连接是一个好主意。

不需要第一个双循环。如果图实际上是强连通的,那么我们从哪个节点开始并不重要。

首先,我注意到您在 DFS 搜索中这样做:

visited[i] == false

DFS1(adjlist, i, visited);

就是说,当您执行此操作时,您没有检查正确的节点。您应该检查的不是索引 i,而是存储在索引 i 处的节点的实际值。

我编辑了你的代码以使用这个想法:

public boolean allDevicesConnected(int[][] adjlist){
    boolean[] marked = new boolean[adjlist.length];  // Default is set to false  

    DFS_helper(0, adjlist, marked);

    for(boolean b : marked)
        if(b == false) return false;

    return true;
}

public void DFS_helper(int node, int[][] adjlist, boolean[] marked){
    marked[node] = true;

    for (int i = 0; i < adjList[node].length; i++) {
        int dest = adjlist[node][i];
        if(marked[dest] == false)
            DFS_helper(dest, adjlist, marked);
    }

}