算法打卡:第十一章 图论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;
    }
 
}
相关推荐
林的快手11 分钟前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
千天夜20 分钟前
多源多点路径规划:基于启发式动态生成树算法的实现
算法·机器学习·动态规划
从以前26 分钟前
准备考试:解决大学入学考试问题
数据结构·python·算法
向阳121843 分钟前
mybatis 缓存
java·缓存·mybatis
.Vcoistnt1 小时前
Codeforces Round 994 (Div. 2)(A-D)
数据结构·c++·算法·贪心算法·动态规划
上等猿1 小时前
函数式编程&Lambda表达式
java
蓝染-惣右介1 小时前
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
java·设计模式
ALISHENGYA1 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战训练三)
数据结构·c++·算法·图论
秋恬意2 小时前
IBatis和MyBatis在细节上的不同有哪些
java·mybatis