当前位置: 首页 > article >正文

【代码随想录Day53】图论Part05

并查集理论基础

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

寻找存在的路径

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

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);
    }
}

http://www.kler.cn/a/369232.html

相关文章:

  • 算法设计与分析:贪心算法思想的应用
  • QT中采用QCustomPlot 实现将buffer中的数据绘制成折线图,并且图形随着数据更新而更新
  • 检索引擎Elasticsearch
  • 平均误差ME、均方误差MSE、均方根误差RMSE、平均均方根误差ARMSE辨析
  • 使用微信免费的内容安全识别接口,UGC场景开发检测违规内容功能
  • 牛客周赛 Round 65(A—G)
  • 海外服务器的价格取决于服务器的性能和租赁时间
  • leetcode-73-矩阵置零
  • 【LeetCode】每日一题 2024_10_22 构成整天的下标对数目 I(暴力/哈希)
  • Golang | Leetcode Golang题解之第502题IPO
  • 嵌入式1_ARM学习(六)——Makefile
  • 【GPIO】2.ADC配置错误,还是能得到电压数据
  • CRC 校验码
  • 【iOS】知乎日报第一周总结
  • Vue3_开启全局websocket
  • Qt6切换音轨
  • ffmpeg视频滤镜:均值模糊-boxblur
  • MAN Truck Bus EDI 需求分析
  • Flutter Column组件实战案例
  • 2024 最新 frida技术栈 第一部分
  • Linux云服务器安装Docker、MySQL、Redis
  • 国产系统安装Oracle报错处理
  • 利用 Google AI 工具提升应用智能化:ML Kit、TensorFlowLite、Cloud Vision、AutoML、Gemini
  • 手机折叠屏贴膜应用
  • 【AI日记】24.10.27 了解AI的未来
  • 0基础学java之Day16