算法训练营DAY55 第十一章:图论part05

并查集理论基础

背景

当我们需要判断两个元素是否在同一个集合里的时候,我们就要想到用并查集。

并查集主要有两个功能:

  • 将两个元素添加到一个集合中。
  • 判断两个元素在不在同一个集合

原理讲解

 从代码层面,我们如何将两个元素添加到同一个集合中呢。

只需要用一个一维数组来表示,即: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; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回father[v] = u;
}

我们的目的是判断这三个元素是否在同一个集合里,知道 A 连通 B 就已经足够了。

这里要讲到寻根思路,只要 A ,B,C 在同一个根下就是同一个集合。

给出A元素,就可以通过 father[A] = B,father[B] = C,找到根为 C。

给出B元素,就可以通过 father[B] = C,找到根也为为 C,说明 A 和 B 是在同一个集合里。

// 并查集里寻根的过程
int find(int u) {if (u == father[u]) return u; // 如果根就是自己,直接返回else return find(father[u]); // 如果根不是自己,就根据数组下标一层一层向下找
}

我们需要 father[C] = C,即C的根也为C,这样就方便表示 A,B,C 都在同一个集合里了。

所以father数组初始化的时候要 father[i] = i,默认自己指向自己。

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

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

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

 路径压缩

在实现 find 函数的过程中,我们知道,通过递归的方式,不断获取father数组下标对应的数值,最终找到这个集合的根。

如果这棵多叉树高度很深的话,每次find函数 去寻找根的过程就要递归很多次。

我们的目的只需要知道这些节点在同一个根下就可以,所以对这棵多叉树的构造只需要这样就可以了,除了根节点其他所有节点都挂载根节点下,这样我们在寻根的时候就很快,只需要一步,如果我们想达到这样的效果,就需要 路径压缩,将非根节点的所有节点直接指向根节点。

我们只需要在递归的过程中,让 father[u] 接住 递归函数 find(father[u]) 的返回结果。

因为 find 函数向上寻找根节点,father[u] 表述 u 的父节点,那么让 father[u] 直接获取 find函数 返回的根节点,这样就让节点 u 的父节点 变成根节点。

// 并查集里寻根的过程
int find(int u) {if (u == father[u]) return u;else return father[u] = find(father[u]); // 路径压缩
}

并查集主要有三个功能。

  1. 寻找根节点,函数:find(int u),也就是判断这个节点的祖先节点是哪个
  2. 将两个节点接入到同一个集合,函数:join(int u, int v),将两个节点连在同一个根节点上
  3. 判断两个节点是否在同一个集合,函数:isSame(int u, int v),就是判断两个节点是不是同一个根节点

107. 寻找存在的路径

107. 寻找存在的路径

题目描述

给定一个包含 n 个节点的无向图中,节点编号从 1 到 n (含 1 和 n )。

你的任务是判断是否有一条从节点 source 出发到节点 destination 的路径存在。

输入描述

第一行包含两个正整数 N 和 M,N 代表节点的个数,M 代表边的个数。

后续 M 行,每行两个正整数 s 和 t,代表从节点 s 与节点 t 之间有一条边。

最后一行包含两个正整数,代表起始节点 source 和目标节点 destination。

输出描述

输出一个整数,代表是否存在从节点 source 到节点 destination 的路径。如果存在,输出 1;否则,输出 0。

输入示例

5 4
1 2
1 3
2 4
3 4
1 4

输出示例

1

#include<iostream>
#include<vector>
using namespace std;
int n;
vector<int> father=vector<int>(101,0);
void init(){for(int i=1;i<=n;i++){father[i]=i;}
}
int find(int u){return u==father[u]?u:father[u]=find(father[u]);
}
bool isSame(int u,int v){u=find(u);v=find(v);return u==v;
}
void join(int u,int v){u=find(u);v=find(v);if(u==v)return;father[v]=u;
}int main(){int m,s,t,ss,d;cin>>n>>m;init();while(m--){cin>>s>>t;join(s,t);}cin>>ss>>d;if(isSame(ss,d))cout<<1<<endl;else cout<<0<<endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92029.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker相关操作记录

1.docker清理服务器上面没有用到的镜像#删除本地镜像 docker rmi $(docker images -q) #强制删除本地镜像 docker rmi $(docker images -q) -f2.docker查看日志docker logs c36c56e4cfa3 (容器id)3.所有运行或没有运行的镜像 docker ps -a4、停止container&#xff0c;这样才…

LInux基础学习笔记七

/dev/zero和/dev/null 是什么/dev/zero&#xff1a;一个零设备文件&#xff0c;读取时会不断返回\0字节&#xff08;零值字节&#xff09;&#xff0c;常用于创建空文件或格式化/dev/null&#xff1a;一个空设备文件&#xff0c;写入它的内容会被丢弃&#xff0c;相当于“黑洞”…

软件架构:系统结构的顶层设计与战略约束

软件架构&#xff1a;系统结构的顶层设计与战略约束软件架构是软件系统的“骨架”与“宪法”&#xff0c;它定义了系统的根本性组织结构&#xff0c;包括构成系统的关键构件、它们之间的组织关系、交互机制、约束原则以及指导性决策。它决定了系统在性能、可扩展性、可靠性、可…

基于spring boot的个人博客系统

2 开发技术 3 2.1 VUE框架 3 2.2 Mysql数据库 3 2.3 Spring Boot框架 3 2.4 layui介绍 4 本程序在设计结构选择上首选B/S&#xff0c;也是为了满足程序今后升级便利&#xff0c;以及程序低维护成本的要求。本程序的网络拓扑设计也会在下图展示&#xff0c;通过图形的方式来描述…

Excel制作尖刀图,直观展示业绩涨跌

Excel制作尖刀图&#xff0c;直观展示业绩涨跌效果展示下图是一个常见的两年业绩同比表&#xff0c;也是尖刀图很常见的数据源类型&#xff0c;但是这个数据格式是无法直接制作的&#xff0c;需要对数据进行加工。1.对数据进行逆透视使用excel进行逆透视&#xff0c;最常见的方…

两种路由模式(React-Router 8)

俩种路由模式 各个主流框架的路由常用的路由模式有俩种&#xff0c;history模式和hash模式,ReactRouter分别由createBrowerRouter和createHashRouter函数负责创建附带代码:import Login from "../page/Login"; import Article from "../page/Article"; imp…

【01】OpenCV C++实战篇——基于多项式插值的亚像素边缘定位算法

文章目录一. 背景二. 你的经历三. 代码实现(龟速版——单线程)3.1 梯度幅值3.1.1 生成 8 个方向模板3.1.2 计算梯度3.1.3 显示梯度图像3.1.4 程序运行演示3.2 梯度方向 &#xff08;梯度最大幅度值和方向&#xff09;3.3 单像素边缘3.4 梯度单像素边缘提取 运行测试四 、亚像素…

400V降24V,200mA,应用领域:从生活到工业的 “全能电源管家”WD5208

WD5208 电源芯片&#xff1a;小身材蕴藏大能量的电源控制新星在电源芯片的技术星河中&#xff0c;WD5208 凭借独特性能与广泛适用性崭露头角&#xff0c;成为众多电子设备电源方案的优选。本文将全面解析这款芯片的核心优势、应用场景与技术细节&#xff0c;展现其 “小身材&am…

C++ 引用 和 指针 的区别

特性引用指针初始化不能为 null&#xff0c;必须绑定到有效的对象可以为 null&#xff0c;不指向任何对象重新绑定不能重新绑定&#xff0c;一旦初始化后始终引用同一个对象可以重新指向其他对象内存占用不占用额外内存&#xff0c;编译器通常将其优化为所引用的对象占用额外内…

Claude Code实战体验:AI智能编程助手如何重塑开发工作流?

一、背景介绍 AI大模型的爆发&#xff0c;让各种智能编码工具如雨后春笋般涌现。Claude Code就是其中非常有代表性的一款——它不仅能补全代码、查找Bug&#xff0c;还能理解复杂需求&#xff0c;甚至帮你写文档、生成测试用例。作为一名全栈开发者&#xff0c;我和团队最近几个…

centos7 个人网站搭建之gitlab私有化部署实现线上发布

文章目录 效果展示架构设计申请免费阿里云服务器尝试连接远程服务 开放端口申请域名 绑定云服务器组网网关服务器配置转发代理网关服务器配置ssl 证书问题排查证书申请时报错&#xff1a;Set the \server_name\ directive ti use the Nginx installer. gitlab私有化部署搭建git…

小米4A千兆版路由器刷机,解决Telnet无法连接问题

刷机极容易变砖&#xff0c;建议完全理清步骤后再进行操作 工具准备 1、小米4A千兆版路由器&#xff08;注意一定是千兆版&#xff0c;只是4A无千兆按下列步骤会变砖&#xff09;&#xff0c;适配电源线 2、网线一根 3、需保证刷机过程中网线接入是有网的&#xff0c;无需账号认…

计算机网络:如何将一个B类IP地址分为4个子网

要将一个B类IP地址划分为4个子网&#xff0c;需通过子网掩码扩展&#xff08;即借位&#xff09;来实现。以下是详细步骤和原理&#xff1a; 一、B类IP地址的基础特性 默认网络位&#xff1a;B类地址前16位为网络位&#xff08;标识网络&#xff09;&#xff0c;后16位为主机位…

K8S 性能瓶颈排查

K8S 性能瓶颈排查 随着业务量增长,Kubernetes 集群经常出现: • Pod 启动慢? • API 响应慢? • 节点 CPU 飙高? • 服务无故中断? 这可能是性能瓶颈在悄悄作祟。 性能瓶颈全局视角 # K8S 性能瓶颈排查思维导图- 集群层面- API Server 响应慢- Etcd 压力大- 控制面组件…

实习005 (web后端springboot)

五种创建方式一、方法一&#xff08;直接创建&#xff09;二、方法二&#xff08;阿里云&#xff09;三、方法三&#xff08;从官网&#xff09;或者说四、方法四、&#xff08;案例云官网&#xff09;五、方法五、&#xff08;自己写&#xff09;先构建javaweb项目刷新后还是出…

基于vscode连接服务器实现远程开发

目录 一、背景介绍 1.1 什么是远程开发 1.2 版本清单 二、以Java项目开发为例 2.1 安装远程开发插件 2.2 安装语言开发插件 2.3 新建ssh连接 2.4 打开服务器目录 一、背景介绍 1.1 什么是远程开发 远程开发是基于服务器环境进行实现本地开发操作&#xff0c;…

Java与Kotlin中“==“、“====“区别

一、Kotlin 中的区别&#xff08;双等于&#xff09; - 结构相等性检查比较两个对象的内容是否相等&#xff08;相当于调用 equals() 方法&#xff09;。自动处理 null 安全&#xff1a;a b 等价于 a?.equals(b) ?: (b null)。示例&#xff1a;val s1 "Hello" v…

接口自动化测试框架-AIM

3天精通Postman接口测试&#xff0c;全套项目实战教程&#xff01;&#xff01;最近在做公司项目的自动化接口测试&#xff0c;在现有几个小框架的基础上&#xff0c;反复研究和实践&#xff0c;搭建了新的测试框架。利用业余时间&#xff0c;把框架总结了下来。 AIM框架介绍 …

Orange的运维学习日记--28.Linux逻辑卷详解

Orange的运维学习日记–28.Linux逻辑卷详解 文章目录Orange的运维学习日记--28.Linux逻辑卷详解为什么使用 LVM基本概念创建物理卷创建卷组创建逻辑卷创建文件系统并挂载清理 LVM 对象扩展与缩减逻辑卷扩展 LV缩减 LV调整文件系统大小扩展 XFS 文件系统扩展 EXT4 文件系统缩减 …

AI大模型学习三十三、HeyGem.ai 服务端(ubuntu)docker 安装 /客户端(win)分离部署

一、说明服务端安装官方安装客户端在windows 上安装解决分离问题利用samba实现共享&#xff0c;我是在局域网访问&#xff0c;安装道理可以在非局域网访问重新弄了一块显卡&#xff0c;所以驱动也重新装下二、环境准备(base) mucunax58:~$ lsb_release -a No LSB modules are …