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

[豪の算法奇妙冒险] 代码随想录算法训练营第五十四天 | 并查集理论基础、Carl107-寻找存在的路径

代码随想录算法训练营第五十四天 | 并查集理论基础、Carl107-寻找存在的路径


并查集理论基础

文章讲解:https://www.programmercarl.com/kamacoder/图论并查集理论基础.html

视频讲解:https://www.bilibili.com/video/BV1pFjUzvES2

​ 并查集常用来解决连通性问题,就是当我们需要判断两个元素是否在同一个集合里的时候,我们就要想到用并查集

​ 并查集主要有两个功能:将两个元素添加到一个集合中、判断两个元素在不在同一个集合

​ 我们将三个元素A,B,C (分别是数字)放在同一个集合,其实就是将三个元素连通在一起。用一个一维数组来表示连通,即:father[A] = B,father[B] = C,这样就表述 A 与 B 与 C连通了(有向连通图)

// 将v, u这条边加入并查集
void join(int u, int v){u = find(u); // 寻找u的根v = find(v); // 寻找v的根if(u == v) return; // 如果根相同,则说明v和u已经在同一集合,无需重复加入father[v] = u;
}

​ 判断这三个元素是否在同一个集合里需要寻根思路,只要 A ,B,C 在同一个根下就是在同一个集合。给出A元素,就可以通过 father[A] = B,father[B] = C,找到A的根为 C;给出B元素,就可以通过 father[B] = C,找到B的根也为 C,说明 A 和 B 是在同一个集合里

// 并查集寻根过程
void find(int u){if(father[u] == u) return u; // 如果自己就是根,则直接返回自己return find(father[u]); // 如果根不是自己,就继续往下递归找根
}

​ 如何表示 C 也在同一个集合里呢?需要 father[C] = C,即C的根也为C,这样就方便表示 A,B,C 都在同一个集合里了。也是因为这样,father数组初始化的时候要father[i] = i,默认自己的根指向自己

// 并查集初始化
void init(){for(int i = 0; i < nodeNum; i++){father[i] = i;}
}

​ 如何判断两个元素是否在同一个集合里?如果通过find函数找到两个元素属于同一个根的话,那么这两个元素就在同一个集合

// 判断u和v是否找到同一个根
boolean isSame(int u, int v){u = find(u);v = find(v);return u == v;
}

​ 另外,在实现find函数的过程中,通过递归的方式不断获取father数组下标对应的数值以此来找到这个集合的根,搜索过程像是从一个多叉树的叶子找到根节点的过程。如果这棵多叉树高度很深,每次find函数去寻找根的过程就要递归很多次

​ 我们的目的只需要知道这些节点在同一个根下,所以可以将这颗多叉树改造,除了根节点,其他所有节点都挂载在根节点下,保持一层,这样寻根的时候就可以很快,由此要进行路径压缩,将非根节点的所有节点直接指向根节点。如何在代码层面实现呢?其实只需要在find函数递归的过程中,用father[u]去接收传过来的根节点find(father[u])即可

int find(int u){if(father[u] == u) return u;father[u] = find(father[u]);return father[u];
}

​ 综上,便有了一份代码模板

void init(){for(int i = 0; i < nodeNum; i++){father[i] = i;}
}int find(int u){if(father[u] == u) return u;father[u] = find(father[u]);return father[u];
}void join(int u, int v){u = find(u);v = find(v);if(u == v) return;father[u] = v;
}boolean isSame(int u, int v){u = find(u);v = find(v);return u == v;
}

Carl107 寻找存在的路径

题目链接:https://kamacoder.com/problempage.php?pid=1179

文章讲解:https://www.programmercarl.com/kamacoder/0107.寻找存在的路径.html

视频讲解:https://www.bilibili.com/video/BV1k3T7zWEVj

​ 并查集基础题目,并查集解决的主要是集合问题:两个节点在不在一个集合、两个节点添加到一个集合中

image-20260309140143824

import java.util.*;public class Main{static int nodeNum = 0;static int edgeNum = 0;public static void initFather(int[] father){for(int i = 1; i <= nodeNum; i++){father[i] = i;}}public static int find(int[] father, int x){if(father[x] == x) return x;father[x] = find(father, father[x]);return father[x];}public static void join(int[] father, int a, int b){a = find(father, a);b = find(father, b);if(a == b) return;father[a] = b;}public static boolean judgeIsSame(int[] father, int a, int b){a = find(father, a);b = find(father, b);if(a == b) return true;return false;}public static void main(String[] args){Scanner scan = new Scanner(System.in);nodeNum = scan.nextInt();edgeNum = scan.nextInt();int[] father = new int[nodeNum+1];initFather(father);for(int i = 0; i < edgeNum; i++){int s = scan.nextInt();int t = scan.nextInt();join(father, s, t);}int source = scan.nextInt();int destination = scan.nextInt();if(judgeIsSame(father, source, destination)){System.out.println(1);}else{System.out.println(0);}}
}
http://www.jsqmd.com/news/453992/

相关文章:

  • 增强现实(AR)波导器件的MTF分析
  • 好写作AI:从零到一,AI辅助初稿撰写实践——3天憋2000字?不存在的!
  • 自己在Simulink上搭建的四永磁同步电机偏差耦合转速同步控制仿真模型
  • 好写作AI:利用好写作AI快速搭建毕业论文核心章节——别再把时间浪费在“憋”上了
  • 2026年 穿线管厂家推荐排行榜:JDG/KBG/PVC/SC/PE/PPR/玻璃钢穿线管,精选优质品牌助力工程布线! - 品牌企业推荐师(官方)
  • 最近在实验室折腾Matlab的轨迹控制,发现这玩意儿真能玩出花。咱们直接从二维无人机航迹跟踪开整。上回给四旋翼写PID跟踪,核心就这几行
  • 上海美莱去眼袋:精雕眼周焕年轻,口碑见证靠谱医美实力 - 速递信息
  • 【SpringBoot】 解决报错Content type ‘multipartform-data; boundary=...; charset=UTF-8‘ not supported
  • 微电网二次控制,下垂控制,具有DOS攻击的周期微电网二次控制,在电压频率恢复到标称值的同时,实...
  • 2026年最新网易企业邮箱联系电话快速查询指南与购买价格详解 - 品牌2026
  • PAT 乙级 1101
  • 收藏备用|35岁不是危机!写10年CRUD没竞争力?程序员靠AI破局指南
  • 【AI数字人系列】三、数字人——定义数字世界中的你
  • 【递归、搜索与回溯】专题(四):回溯算法综合大练兵(上)—— 子集、排列与组合的进阶
  • 跨境卖家如何应对平台对重复铺货的治理升级
  • WordPress 中的Alt文本与图像标题区别
  • 2026年度社交脱单辅助与高情商聊天工具深度测评:谁才是真正的社交解药?
  • 【C/C++】无锁SPSC环形队列
  • JVM中的垃圾回收机制(速记版)
  • VMware虚拟机的安装
  • 毕设程序javaKTV点歌系统 基于SpringBoot的在线音乐点播与管理系统 智能化歌厅曲目服务平台的设计与实现
  • Nexpose 8.38.0 for Linux Windows 发布 - 漏洞扫描
  • 电力系统优化运行与编程:电网规划、负荷预测及潮流计算的Matlab代码模型复现
  • 让预测模型自己进化:BES-SVM黑科技实战
  • AI视频三巨头:一场关于未来想象力的终极PK
  • 瑞祥卡余额怎么提现到支付宝,高效变现指南 - 淘淘收小程序
  • 【C++初阶】:(3)C++基础类和对象(中)
  • 《从零开始的java从入门到入土的学习生活——JavaWeb前端篇》Chapter16——JavaWeb前端篇学习记录——HTML、CSS、盒子模型、flex弹性布局、表单标签
  • 毕设程序javaweb的计算机课程在线学习平台 基于Java Web的计算机技术在线教学与实训平台 计算机专业网络教育及技能测评系统
  • TechWiz LCD 1D应用:高延迟膜(彩虹mura仿真)