算法打卡:第十一章 图论part05

今日收获:并查集理论基础,寻找存在的路径

1. 并查集理论基础(from代码随想录)

(1)应用场景:判断两个元素是否在同一个集合中

(2)原理讲解:通过一个一维数组,根存储的元素是自己,其他节点存储的元素是自己的上一级元素。在查找时,判断两个元素的根是否相同。

(3)路径压缩:让所有的其他节点都直接存储根节点,避免树的高度太深,递归次数太多

(4)主要功能:

  • 寻找任意节点的根节点;
  • 将两个节点加入同一个集合;
  • 判断两个节点是否在同一个集合;

(5)常见误区:在添加节点时,必须先找到两个节点的根,然后将根相连。

2. 寻找存在的路径

题目链接:107. 寻找存在的路径

思路:将节点用并查集的方式存储,判断两节点是否存在路径就是看这两个节点的根节点是否相同

方法:

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

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        
        // 接收数据
        int N=sc.nextInt();
        int M=sc.nextInt();
        
        int[] tree=new int[N+1];
        // 初始化,每个节点都是根节点
        for (int i=1;i<N+1;i++){
            tree[i]=i;
        }
        
        // 添加节点
        for (int i=0;i<M;i++){
            int s=sc.nextInt();
            int t=sc.nextInt();
            
            int sRoot=find(tree,s);
            int tRoot=find(tree,t);
            
            tree[tRoot]=sRoot;
        }
        
        int source=sc.nextInt();
        int dest=sc.nextInt();
        
        int root1=find(tree,source);
        int root2=find(tree,dest);
        
    
        if (root1==root2){
            System.out.println(1);
        }else {
            System.out.println(0);
        }  
    }
    
    // 寻找根节点
    public static int find(int[] tree, int node){
        if (tree[node]==node){  // 根节点
            return node;
        }
        
        return tree[node]=find(tree,tree[node]);
    }
}

3. 并查集Java模板

主要的方法:寻找根节点,加入并查集,判断是否连接

java 复制代码
//并查集模板
class DisJoint{
    private int[] father;
 
    public DisJoint(int N) {
        father = new int[N];
        for (int i = 0; i < N; ++i){
            father[i] = i;
        }
    }
 
    public int find(int n) {
        return n == father[n] ? n : (father[n] = find(father[n]));
    }
 
    public void join (int n, int m) {
        n = find(n);
        m = find(m);
        if (n == m) return;
        father[m] = n;
    }
 
    public boolean isSame(int n, int m){
        n = find(n);
        m = find(m);
        return n == m;
    }
 
}
相关推荐
杨过过儿4 分钟前
【Task02】:四步构建简单rag(第一章3节)
android·java·数据库
青云交5 分钟前
Java 大视界 -- Java 大数据分布式计算在基因测序数据分析与精准医疗中的应用(400)
java·hadoop·spark·分布式计算·基因测序·java 大数据·精准医疗
荔枝爱编程8 分钟前
如何在 Docker 容器中使用 Arthas 监控 Java 应用
java·后端·docker
喵手14 分钟前
Java中Stream与集合框架的差异:如何通过Stream提升效率!
java·后端·java ee
JavaArchJourney16 分钟前
PriorityQueue 源码分析
java·源码
学行库小秘16 分钟前
基于门控循环单元的数据回归预测 GRU
人工智能·深度学习·神经网络·算法·回归·gru
喵手26 分钟前
你知道,如何使用Java的多线程机制优化高并发应用吗?
java·后端·java ee
_meow_31 分钟前
数学建模 15 逻辑回归与随机森林
算法·数学建模·逻辑回归
渣哥40 分钟前
10年Java老司机告诉你:为什么永远不要相信浮点数相等
java
1白天的黑夜11 小时前
链表-24.两两交换链表中的结点-力扣(LeetCode)
数据结构·leetcode·链表