算法打卡:第十一章 图论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;
    }
 
}
相关推荐
满分观察网友z几秒前
从一次手滑,我洞悉了用户输入的所有可能性(3330. 找到初始输入字符串 I)
算法
一头生产的驴15 分钟前
java整合itext pdf实现自定义PDF文件格式导出
java·spring boot·pdf·itextpdf
YuTaoShao22 分钟前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
Heartoxx23 分钟前
c语言-指针(数组)练习2
c语言·数据结构·算法
zzywxc78725 分钟前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
大熊背37 分钟前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft
满分观察网友z41 分钟前
别怕树!一层一层剥开它的心:用BFS/DFS优雅计算层平均值(637. 二叉树的层平均值)
算法
杰克尼2 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode
YuTaoShao3 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
程序员张33 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端