【代码随想录Day53】图论Part05

并查集理论基础

题目链接/文章讲解:并查集理论基础 | 代码随想录

寻找存在的路径

题目链接/文章讲解:代码随想录

java 复制代码
import java.util.*;

public class Main {
    public static void main(String[] args) {
        int numberOfElements, numberOfConnections;
        Scanner scanner = new Scanner(System.in);

        // 读取元素数量和连接数量
        numberOfElements = scanner.nextInt();
        numberOfConnections = scanner.nextInt();

        // 初始化并查集
        DisjointSetUnion disjointSet = new DisjointSetUnion(numberOfElements + 1);

        // 读取每对连接并合并
        for (int i = 0; i < numberOfConnections; ++i) {
            int elementA = scanner.nextInt();
            int elementB = scanner.nextInt();
            disjointSet.union(elementA, elementB);
        }

        // 检查两个元素是否在同一集合中
        int queryElementA = scanner.nextInt();
        int queryElementB = scanner.nextInt();
        if (disjointSet.isConnected(queryElementA, queryElementB)) {
            System.out.println("1"); // 在同一集合
        } else {
            System.out.println("0"); // 不在同一集合
        }
    }
}

// 并查集实现
class DisjointSetUnion {
    private int[] parent;

    public DisjointSetUnion(int size) {
        parent = new int[size];
        // 初始化每个元素的父节点为自己
        for (int i = 0; i < size; ++i) {
            parent[i] = i;
        }
    }

    // 查找元素的根节点,并进行路径压缩
    public int find(int element) {
        if (element != parent[element]) {
            parent[element] = find(parent[element]); // 路径压缩
        }
        return parent[element];
    }

    // 合并两个元素的集合
    public void union(int elementA, int elementB) {
        int rootA = find(elementA);
        int rootB = find(elementB);
        if (rootA != rootB) {
            parent[rootB] = rootA; // 将B的根节点指向A的根节点
        }
    }

    // 检查两个元素是否在同一集合中
    public boolean isConnected(int elementA, int elementB) {
        return find(elementA) == find(elementB);
    }
}
相关推荐
逑之22 分钟前
C语言笔记10:sizeof和strlen,指针与数组
c语言·笔记·算法
求梦82026 分钟前
【力扣hot100题】旋转图像(15)
算法·leetcode·职场和发展
海边的Kurisu1 小时前
苍穹外卖日记 | Day1 苍穹外卖概述、开发环境搭建、接口文档
java
C雨后彩虹5 小时前
任务最优调度
java·数据结构·算法·华为·面试
heartbeat..5 小时前
Spring AOP 全面详解(通俗易懂 + 核心知识点 + 完整案例)
java·数据库·spring·aop
Jing_jing_X5 小时前
AI分析不同阶层思维 二:Spring 的事务在什么情况下会失效?
java·spring·架构·提升·薪资
少林码僧7 小时前
2.31 机器学习神器项目实战:如何在真实项目中应用XGBoost等算法
人工智能·python·算法·机器学习·ai·数据挖掘
钱彬 (Qian Bin)7 小时前
项目实践15—全球证件智能识别系统(切换为Qwen3-VL-8B-Instruct图文多模态大模型)
人工智能·算法·机器学习·多模态·全球证件识别
元Y亨H7 小时前
Nacos - 服务发现
java·微服务
微露清风7 小时前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习