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

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

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

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

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

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

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

(4)主要功能:

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

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

2. 寻找存在的路径

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

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

方法:

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模板

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

//并查集模板
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;}}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于jsonpath的JSON数据查找
  • linux安装nginx+前端部署vue项目(实际测试react项目也可以)
  • vue-入门速通
  • Java基础知识扫盲
  • 【ppt2svg svg2png/jpg】ppt转图片解决方案
  • [Linux]用户管理指令
  • openai最新o1上线(2024年09月12日)
  • 研1日记15
  • PHPStorm如何调整字体大小
  • 网络信息传输安全
  • 1.《DevOps》系列K8S部署CICD流水线之部署K8S集群~version1.28.2
  • Qt_事件的介绍
  • C语言中的typedef简介
  • 达梦-华为鲲鹏ARM架构下性能测试最佳实践
  • 【字符串】介绍
  • Angular Elements 及其运作原理
  • AWS实战 - 利用IAM对S3做访问控制
  • Docker容器管理
  • ES6 ...操作符
  • Hexo+码云+git快速搭建免费的静态Blog
  • java2019面试题北京
  • JSDuck 与 AngularJS 融合技巧
  • Python 基础起步 (十) 什么叫函数?
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 工作中总结前端开发流程--vue项目
  • 关于Flux,Vuex,Redux的思考
  • 观察者模式实现非直接耦合
  • 技术:超级实用的电脑小技巧
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 深入 Nginx 之配置篇
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 为视图添加丝滑的水波纹
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 阿里云服务器如何修改远程端口?
  • ​马来语翻译中文去哪比较好?
  • #APPINVENTOR学习记录
  • (1)虚拟机的安装与使用,linux系统安装
  • (javascript)再说document.body.scrollTop的使用问题
  • (NSDate) 时间 (time )比较
  • (rabbitmq的高级特性)消息可靠性
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (转)甲方乙方——赵民谈找工作
  • (转)四层和七层负载均衡的区别
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ***测试-HTTP方法
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .Net Core 笔试1
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别