📜  使用DFS检查无向图是否连通的Java程序(1)

📅  最后修改于: 2023-12-03 14:49:48.121000             🧑  作者: Mango

使用DFS检查无向图是否连通的Java程序

这是一个使用深度优先搜索(DFS)算法来检查无向图是否连通的Java程序。

算法原理

DFS是一种用于遍历或搜索图的算法。在无向图中,我们从任意一个顶点开始进行DFS遍历,如果遍历到的所有顶点都与起始顶点相连,则图是连通的;否则,图是不连通的。

该算法通过递归地访问每个顶点的邻居节点来实现。在访问一个节点时,我们将其标记为已访问,并继续递归地访问其未被访问的邻居节点,直到所有节点都被访问过或没有未被访问的节点为止。

Java代码实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Graph {
    private int V;
    private List<List<Integer>> adj;

    Graph(int v) {
        V = v;
        adj = new ArrayList<>(v);
        for (int i = 0; i < v; ++i)
            adj.add(new ArrayList<>());
    }

    void addEdge(int v, int w) {
        adj.get(v).add(w);
        adj.get(w).add(v);
    }

    void DFSUtil(int v, boolean[] visited) {
        visited[v] = true;

        for (int i : adj.get(v)) {
            if (!visited[i])
                DFSUtil(i, visited);
        }
    }

    boolean isConnected() {
        boolean[] visited = new boolean[V];
        Arrays.fill(visited, false);

        DFSUtil(0, visited);

        for (int i = 0; i < V; ++i) {
            if (!visited[i])
                return false;
        }

        return true;
    }
}

public class Main {
    public static void main(String[] args) {
        Graph g = new Graph(5);
        g.addEdge(1, 0);
        g.addEdge(2, 3);
        g.addEdge(3, 4);

        if (g.isConnected())
            System.out.println("Graph is connected");
        else
            System.out.println("Graph is not connected");
    }
}
解释
  1. Graph 类表示了一个无向图,其中 V 表示顶点数,adj 是一个邻接表,用于存储每个顶点的邻居节点。

  2. addEdge 方法用于添加边,因为是无向图,所以同时需要在两个顶点之间添加边。

  3. DFSUtil 方法是实现DFS算法的核心方法。它使用递归地访问节点的邻居节点,并将访问过的节点标记为已访问。

  4. isConnected 方法用于检查图是否连通。它使用一个辅助数组 visited 来记录每个顶点是否被访问过。首先初始化所有顶点为未访问状态,然后从一个任意顶点开始进行DFS遍历。最后,检查 visited 数组中是否存在未被访问的顶点,如果有则返回 false,否则返回 true

  5. main 方法中创建了一个示例图,并调用 isConnected 方法来检查图是否连通。根据返回结果,打印相应的信息。

输出

如果图是连通的,程序将输出 Graph is connected;如果图是不连通的,程序将输出 Graph is not connected

总结

本Java程序展示了使用DFS算法来检查无向图是否连通的实现。DFS算法是一种常用的图遍历和搜索算法,在解决与图相关的问题时非常有用。使用该算法,我们可以确定图是否连通,从而进行进一步的图处理或分析。