当前位置:首页 > Java

java图如何判断连通

2026-03-18 19:23:44Java

判断图的连通性

在Java中判断图是否连通,可以通过深度优先搜索(DFS)或广度优先搜索(BFS)实现。连通图是指任意两个顶点之间都存在路径的无向图。以下是具体实现方法:

使用深度优先搜索(DFS)

  1. 初始化访问数组 创建一个布尔数组visited,用于标记顶点是否被访问过,初始时所有顶点均未访问。

  2. 从任意顶点开始DFS 选择一个顶点作为起点,执行DFS遍历,标记所有访问过的顶点。

  3. 检查所有顶点是否被访问 遍历结束后,检查visited数组是否全部为true。若存在未被访问的顶点,则图不连通。

import java.util.*;

public class Graph {
    private int V; // 顶点数
    private LinkedList<Integer>[] adj; // 邻接表

    Graph(int v) {
        V = v;
        adj = new LinkedList[v];
        for (int i = 0; i < v; ++i)
            adj[i] = new LinkedList();
    }

    void addEdge(int v, int w) {
        adj[v].add(w);
        adj[w].add(v); // 无向图需双向添加
    }

    void DFSUtil(int v, boolean[] visited) {
        visited[v] = true;
        for (int n : adj[v]) {
            if (!visited[n])
                DFSUtil(n, visited);
        }
    }

    boolean isConnected() {
        boolean[] visited = new boolean[V];
        DFSUtil(0, visited); // 从顶点0开始DFS
        for (boolean b : visited)
            if (!b) return false;
        return true;
    }

    public static void main(String args[]) {
        Graph g = new Graph(4);
        g.addEdge(0, 1);
        g.addEdge(0, 2);
        g.addEdge(1, 2);
        g.addEdge(2, 3);
        System.out.println("图是否连通: " + g.isConnected());
    }
}

使用广度优先搜索(BFS)

  1. 初始化访问数组和队列 创建visited数组和一个队列,用于BFS遍历。

  2. 从起点开始BFS 将起点加入队列,标记为已访问,依次处理队列中的顶点,直到队列为空。

  3. 验证连通性 检查visited数组是否全部为true

boolean isConnectedBFS() {
    boolean[] visited = new boolean[V];
    Queue<Integer> queue = new LinkedList<>();
    queue.add(0);
    visited[0] = true;

    while (!queue.isEmpty()) {
        int v = queue.poll();
        for (int n : adj[v]) {
            if (!visited[n]) {
                visited[n] = true;
                queue.add(n);
            }
        }
    }

    for (boolean b : visited)
        if (!b) return false;
    return true;
}

处理不连通图

对于有向图,需要检查强连通性(所有顶点双向可达)。可通过以下步骤实现:

java图如何判断连通

  1. 对每个顶点执行DFS或BFS,检查是否能访问所有其他顶点。
  2. 使用Kosaraju算法或Tarjan算法判断强连通分量。

复杂度分析

  • 时间复杂度:DFS和BFS均为O(V + E),其中V为顶点数,E为边数。
  • 空间复杂度:O(V),用于存储访问数组和递归栈(DFS)或队列(BFS)。

分享给朋友:

相关文章

如何使用java

如何使用java

安装Java开发环境 下载并安装Java Development Kit(JDK),推荐从Oracle官网或OpenJDK获取最新版本。安装完成后配置环境变量,确保JAVA_HOME指向JDK安装路径…

java程序如何运行

java程序如何运行

编写Java代码 使用文本编辑器或IDE(如IntelliJ IDEA、Eclipse)编写Java源代码,保存为.java文件。例如: public class HelloWorld {…

java如何输入数组

java如何输入数组

输入数组的方法 在Java中,可以通过多种方式输入数组,具体取决于输入源(如控制台、文件等)和数组类型(如基本类型或对象类型)。以下是几种常见的方法: 使用Scanner从控制台输入 对于基本数据类…

java如何输入数据

java如何输入数据

输入数据的方法 在Java中,输入数据可以通过多种方式实现,具体取决于输入来源(如控制台、文件、网络等)。以下是几种常见的方法: 使用Scanner类从控制台输入 Scanner类是Java中最常用…

如何安装java环境

如何安装java环境

下载JDK安装包 访问Oracle官方网站或OpenJDK项目页面,选择适合操作系统的JDK版本(如Windows、macOS或Linux)。确保下载与系统架构匹配的版本(32位或64位)。 运行安…

java如何创建项目

java如何创建项目

使用IDE创建Java项目(以IntelliJ IDEA为例) 打开IntelliJ IDEA,选择“New Project”。 在左侧菜单中选择“Java”,确保已配置JDK(若无需手动添加)。 勾…