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

并查集-应用方向以及衍生汇总+代码实现(c++)-学习一个数据结构就会做三类大题!

并查集的核心功能,合并集合,查找元素,这两个最基本的功能相关题目本文不列举了,主要是一些和图相关的:

并查集的核心母题

  • 一、连通性检测:
    • 问题:判断在一个图中,任意两点是否连通。
    • 应用:这是并查集最基本的功能,通过 find 操作可以判断两个节点是否属于同一个连通分量。
    • 衍生问题:
      • 判断两点是否在同一个连通分量中。
      • 找出图中有多少个连通分量(即独立的子图)。
      • 在图中动态地添加边,并检查连通性。
无向图,任意两点是否连通 问题代码

(注释中输入输出很清晰了)

  • 关键!如果在一个连通分量中~根节点会是一样的 ~find值相同
#include<iostream>
using namespace std;const int MAXN = 100010;
int fa[MAXN];  // 并查集的父节点数组// 初始化,每个节点都是自己的父节点
void init(int n) {for(int i = 1; i <= n; i++)fa[i] = i;
}// 查找根节点,并进行路径压缩
int find(int x) {if (fa[x] != x) {fa[x] = find(fa[x]);  }return fa[x];
}// 合并两个节点所在的集合
void join(int x, int y) {int fx = find(x);int fy = find(y);if(fx != fy)fa[fx] = fy;  // 将其中一个根节点指向另一个
}// 判断两点是否连通bool isConnected(int x, int y) {return find(x) == find(y);
}int main() {int n, m;cin >> n >> m;  // n为节点数,m为边数init(n);  // 初始化并查集// 读取每条边并进行合并for(int i = 0; i < m; i++) {int u, v;cin >> u >> v;join(u, v);}// 查询两点是否连通int a, b;cin >> a >> b;if(isConnected(a, b))cout << "Yes, they are connected." << endl;elsecout << "No, they are not connected." << endl;return 0;
}
  • 二、连通分量的管理:

    • 问题:管理图中的多个连通分量,支持动态的合并与查询操作。
    • 应用:这是并查集的核心应用,使用 union 操作可以将两个连通分量合并,通过 find 操作查询某个节点所属的连通分量。
    • 衍生问题:
      • 求解有多少个连通分量。
      • 在合并过程中检测图中是否形成了环。
      • 处理动态连通性问题(如动态添加或删除边)。
      • 判断图是否为树(只有一个连通分量且无环)。
求解连通分量个数 问题代码:
  • 关键:计算有多少个根节点就可以了,所以遍历所有的点,看有多少个点满足fa[i]==i;
#include<iostream>
using namespace std;const int MAXN = 100010;
int fa[MAXN];  // 并查集的父节点数组// 初始化,每个节点都是自己的父节点
void init(int n) {for(int i = 1; i <= n; i++)fa[i] = i;
}// 查找根节点,并进行路径压缩
int find(int x) {if (fa[x] != x) {fa[x] = find(fa[x]);  }return fa[x];
}// 合并两个节点所在的集合
void join(int x, int y) {int fx = find(x);int fy = find(y);if(fx != fy)fa[fx] = fy;  // 将其中一个根节点指向另一个
}int main() {int n, m;cin >> n >> m;  // n为节点数,m为边数init(n);  // 初始化并查集// 读取每条边并进行合并for(int i = 0; i < m; i++) {int u, v;cin >> u >> v;join(u, v);}// 计算连通分量的数量int components = 0;for(int i = 1; i <= n; i++) {if(find(i) == i)  // 如果节点是它自己的父节点,说明它是一个连通分量的根components++;}cout << "Number of connected components: " << components << endl;return 0;
}
  • 三、环检测:
    • 问题:判断在无向图中是否存在环。
    • 应用:在合并过程中,如果发现两个节点已经在同一个连通分量中,那么在添加这条边之后会形成环。
    • 衍生问题:
      • 在无向图中检测是否有环。
      • 在最小生成树算法中(Kruskal),通过避免环的方式构造最小生成树。
      • 删除图中冗余的边以防止形成环(如冗余连接问题)。
是否有环 问题代码
  • 关键是在join函数中进行判断,正常的逻辑是找到根节点,如果不同就把一个的father指向另一个;
  • 而现在是如果相同就说明存在还,如果需要判断的时候就直接返回true就可以啦!
#include<iostream>
using namespace std;const int MAXN = 100010;
int fa[MAXN];  // 并查集的父节点数组// 初始化,每个节点都是自己的父节点
void init(int n) {for(int i = 1; i <= n; i++)fa[i] = i;
}// 查找根节点,并进行路径压缩
int find(int x) {if (fa[x] != x) {fa[x] = find(fa[x]);  }return fa[x];
}// 合并两个节点所在的集合bool join(int x, int y) {int fx = find(x);int fy = find(y);if(fx == fy)return true;  // 如果两个节点的根节点相同,说明形成了环fa[fx] = fy;return false;
}int main() {int n, m;cin >> n >> m;  // n为节点数,m为边数init(n);  // 初始化并查集bool hasCycle = false;// 读取每条边并进行合并for(int i = 0; i < m; i++) {int u, v;cin >> u >> v;if(join(u, v)) {hasCycle = true;  // 一旦发现环,标记并停止后续检测}}// 输出是否存在环if(hasCycle)cout << "Graph contains a cycle." << endl;elsecout << "Graph does not contain a cycle." << endl;return 0;
}

例题:

Problem Description
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。

在这里插入图片描述

Input
输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。每两组数据之间有一个空行。
整个文件以两个-1结尾。

Output
对于输入的每一组数据,输出仅包括一行。如果该迷宫符合小希的思路,那么输出"Yes",否则输出"No"。

Sample Input
6 8 5 3 5 2 6 4
5 6 0 0

8 1 7 3 6 2 8 9 7 5
7 4 7 8 7 6 0 0

3 8 6 8 6 4
5 3 5 6 5 2 0 0

-1 -1

Sample Output
Yes
Yes
No

  • 分析:判断两个点,1.是不是只有一个连通分量(整体是一个连通图)2.是否有环
  • 因为在图中使用点不一定是0开始逐一往上,所以需要visit数组来辅助我们判断
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;int vis[1000010], fa[1000010];
int m, n, flag;// 初始化每个节点的父节点为其自身
void init() {for(int i = 1; i < 1000010; i++)fa[i] = i;
}// 查找根节点并进行路径压缩
int find(int x) {return fa[x] == x ? x : (fa[x] = find(fa[x]));
}// 合并两个节点所属的集合
void join(int x, int y) {int fx = find(x);int fy = find(y);if(fx == fy)flag = 1;  // 出现环elsefa[fx] = fy;
}int main() {while(scanf("%d%d", &n, &m) != EOF) {if(m == 0 && n == 0) {printf("Yes\n");continue;  // 空树,自动满足条件}if(m == -1 && n == -1) break;  // 结束输入memset(vis, 0, sizeof(vis));  // 重置访问数组init();flag = 0;vis[n] = vis[m] = 1;  // 标记访问过的节点join(n, m);// 继续读入其他边//首先执行 scanf,然后判断 a | b 的值,如果 a 或 b 不为 0,则进入循环。while(scanf("%d%d", &n, &m), n | m) {vis[n] = vis[m] = 1;join(m, n);}int s = 0;// 检查连通分量的数量for(int i = 1; i < 1000010; i++) {if(fa[i] == i && vis[i])s++;if(s > 1) {  // 超过一个连通分量,不是树flag = 1;break;}}// 输出结果printf(flag ? "No\n" : "Yes\n");}return 0;
}

相关文章:

并查集-应用方向以及衍生汇总+代码实现(c++)-学习一个数据结构就会做三类大题!

并查集的核心功能&#xff0c;合并集合&#xff0c;查找元素&#xff0c;这两个最基本的功能相关题目本文不列举了&#xff0c;主要是一些和图相关的&#xff1a; 并查集的核心母题 一、连通性检测&#xff1a; 问题&#xff1a;判断在一个图中&#xff0c;任意两点是否连通。…...

设计模式六大原则-开放封闭原则(二)

开放封闭原则&#xff08;Open-Closed Principle, OCP&#xff09;是设计模式六大原则之一&#xff0c;也是面向对象设计&#xff08;OOD&#xff09;中的核心原则之一。它强调软件实体&#xff08;如类、模块、函数等&#xff09;应该对扩展开放&#xff0c;对修改封闭。这一原…...

C# 截取两个点之间的线段,等距分割线

//取线段上两点之间的沿线线段//line 线//startDist:距离线第一个点的起点位置//stopDist:距离线第一个点的终点位置public static List<double[]> lineSliceAlong(List<double[]> line, double startDist, double stopDist){double travelled 0;double overshot …...

打造聊天流式回复效果:Spring Boot+WebSocket + JS实战

本篇博客将带领你使用 Spring Boot、WebSocket 和 JavaScript 实现一个类似 ChatGPT 的流式回复效果。前端发送消息后&#xff0c;后端接收消息并请求 AI API&#xff0c;并将 AI 返回的流式响应实时推送到前端&#xff0c;最终在聊天界面呈现出逐字出现的打字效果。 技术原理…...

202年版最新Python下载安装+PyCharm下载安装激活和使用教程!(附安装包+激活码)

一、Python解释器下载【运行环境】 Python官网&#xff1a; https://www.python.org Python各版本解释器官网&#xff1a; https://www.python.org/downloads/ 二、Windows系统安装Python解释器 下载Python版本解释器 现在已经更新到了3.13版本的Python解释器&#xff0c;但…...

【面试宝典】spring常见面试题总结[上]

一、什么是 Spring 框架&#xff1f; Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。 Spring 帮助开发者解决基础性的问题&#xff0c;使开发者专注编写业务代码。 二、Spring Freamework 有哪些功能&#xff1f; IOC: 控制反转AOP: 面…...

NC单链表的排序

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一个节点…...

阿里云部署open-webui实现openai代理服务(持续更新)

一、展示 xiezhaoxuan.top:8080 二、 环境准备 1. 阿里云服务器,ubuntu22系统 2. http代理(可访问外网) 3. openai API Key 三、实际操作记录(阿里云服务器端) 1. 根据官方文档安装open-webui服务端(看完这节再操作): 🚀 Getting Started | Open WebUI 1. 如果服务器配置比较…...

Vue3简介和快速体验

文章目录 前言1. Vue3介绍2. Vue3快速体验(非工程化方式) 前言 本次主要用VScode开发代码&#xff0c;vscode的安装很简单&#xff0c;不会的可以查询一下网上的资料 1. Vue3介绍 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于…...

LeetCode98 验证二叉搜索树

前言 题目&#xff1a; 98. 验证二叉搜索树 文档&#xff1a; 代码随想录——验证二叉搜索树 编程语言&#xff1a; C 解题状态&#xff1a; 对中序遍历理解不到位 思路 了解了中序遍历会返回一个有序数组后&#xff0c;本题就可以迎刃而解。只需要判断&#xff0c;返回的数组…...

llama的神经网络结构;llama的神经网络结构中没有MLP吗;nanogpt的神经网络结构;残差是什么;残差连接:主要梯度消失

目录 解释代码 潜在问题和修正 结论 llama的神经网络结构 神经网络结构概述 举例说明 llama的神经网络结构中没有MLP吗 nanogpt的神经网络结构 1. 词嵌入层(Embedding Layer) 2. Transformer编码器层(Transformer Encoder Layer) 3. 层归一化(Layer Normalizat…...

函数的常量引用入参const saclass sdf,可否传入一个指向saclass对象的指针 shared_ptr<saclass>

不可以直接将一个指向 saclass 对象的 shared_ptr<saclass> 作为参数直接传入一个期望 const saclass& 类型参数的函数。原因是类型不匹配&#xff1a;shared_ptr<saclass> 是一个智能指针类型&#xff0c;它封装了对 saclass 对象的指针&#xff0c;并提供了一…...

数据库:SQL——数据库操作的核心语言

数据库&#xff1a;SQL——数据库操作的核心语言 SQL&#xff08;结构化查询语言&#xff09;是关系型数据库管理系统中的标准语言&#xff0c;广泛用于数据的定义、操作、控制和查询。SQL 包含多个子语言&#xff0c;分别用于不同的数据库操作任务&#xff0c;包括数据定义&a…...

Unity + HybridCLR 从零开始

官方文档开始学习,快速上手 | HybridCLR (code-philosophy.com)是官方文档链接 1.建议使用2019.4.40、2020.3.26、 2021.3.0、2022.3.0 中任一版本至于其他2019-2022LTS版本可能出现打包失败情况 2. Windows Win下需要安装visual studio 2019或更高版本。安装时至少要包含 使…...

C++小总结

C小总结 接口 对外暴露头文件中&#xff0c;只需要声明接口函数即可&#xff0c;其他不暴露的函数不需要进行声明。接口的参数使用指针形式比较好&#xff0c;因为外部使用时可以对实参进行创建和析构&#xff0c;如果非接口函数使用new开辟&#xff0c;不太好进行析构。在使…...

从快到慢学习Git指令

Git是现在最流行的版本控制工具之一。无论是在开源社区还是企业软件开发中,Git都扮演着至关重要的角色。本文将根据不同的需求,分别提供快速上手和深入学习Git的指南。 如果你只想下载代码 如果你只是想下载GitHub或其他代码仓库的代码,那你只需要了解以下两个命令: git clo…...

传奇游戏发布渠道

传奇游戏发布渠道 回答&#xff1a;游戏发布平台|手机游戏发布平台 传奇游戏发布渠道作为游戏开发商直接控制的信息传播途径&#xff0c;其安全性自然有着较高的保障。首先&#xff0c;渠道通常会采用先进的加密技术和安全协议来保护数据传输过程中的安全&#xff0c;防止信息…...

如何有效阅读科研论文【方法论】

如何读论文【论文精读1】_哔哩哔哩_bilibili 如何有效阅读科研论文 科研论文是了解学术领域最新研究成果和技术发展的重要途径。有效地阅读论文不仅能够帮助我们掌握前沿知识&#xff0c;还能提升自己的研究能力。本文将介绍一种系统的论文阅读方法&#xff0c;并通过具体的步…...

【揭秘】层层加码,竟能加速渠道营销数字化?-eBest

国潮饮料品牌在eBest RTM系统的支持下&#xff0c;已经将数字化贯彻到每一个销售环节&#xff0c;且看eBest如何通过“层层加码”&#xff0c;进一步加速该饮料品牌渠道数字化进程&#xff0c;实现弯道超车&#xff1f; “一箱四码”垛码 五码实现渠道数字化 为提高营销和数字…...

基于WAMP环境的简单用户登录系统实现(v3版)(持续迭代)

目录 版本说明 实现环境&#xff1a; 流程逻辑框图&#xff1a; 数据库连接 登录页面&#xff1a;login.html 登录处理实现&#xff1a;doLogin.php 用户欢迎页面&#xff1a;welcome.php 密码修改页面&#xff1a;change_password.html 修改处理&#xff1a;doChangePa…...

大语言模型与多模态大模型loss计算

文章目录 前言一、大语言模型loss计算1、loss计算代码解读2、构建模型输入内容与label标签3、input_ids与labels格式 二、多模态大模型loss计算方法1、多模态loss计算代码解读2、多模态输入内容2、大语言模型输入内容3、图像embending如何嵌入文本embeding 前言 如果看了我前面…...

线上研讨会 | CATIA助力AI提升汽车造型设计

报名链接&#xff1a; 2024探索之旅第二季...

Unity新输入系统 之 InputAction(输入配置文件最基本的单位)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的构成结构&#xff1a;Unity新输入系统结构概览-CSDN博客 Input System - Unity 手册 1.In…...

【3】MySQL的安装即启动

目录 一.下载 二.安装 三.启动 一.下载 二.安装 安装MySQL时遇到的Initializing database错误&#xff1a;推荐下面的博客&#xff08;简单就是电脑名不要出现中文&#xff09; https://blog.csdn.net/m0_52775858/article/details/123705566 三.启动 PS&#xff1a;cmd要…...

变“金点子”为“好应用”,合合信息智能文档处理技术助力大学生探索AI创新边界

谈“糖”色变、追求养生、低卡生活……这些热门词汇频频在社交媒体上掀起讨论热潮。有这样一批年轻人不但捕捉到了这些词汇背后真实的用户需求&#xff0c;并且正在利用AI技术寻找解决之道。 近日&#xff0c;“中国大学生服务外包创新创业大赛”&#xff08;以下简称“服创大…...

央行重提P2P存量业务化解,非吸案开始翻旧账?

沉寂已久的P2P&#xff0c;又突然以另一种意想不到的形式回到公众视野了。2018年全国P2P坍塌式暴雷&#xff0c;平台老板“跑路”“判刑”的消息一时间你方唱罢我登场。当年的某凰金融、某租宝、某信贷等赫赫有名的网贷平台传出的消息无非两类——查封或跑路&#xff0c;这几年…...

8B 端侧小模型 | 能力全面对标GPT-4V!单图、多图、视频理解端侧三冠王,这个国产AI开源项目火爆全网

这两天&#xff0c; Github上一个 国产开源AI 项目杀疯了&#xff01;一开源就登上了 Github Trending 榜前列&#xff0c;一天就获得将近600 star。 这个项目就是国内大模型四小龙之一面壁智能最新大打造的面壁「小钢炮」 MiniCPM-V 2.6 。它再次刷新端侧多模态天花板&#xf…...

汽车免拆诊断案例 | DAF(达富)汽油尾气处理液故障警示

故障现象 距离我上次在货卡上工作已经有一段时间了&#xff0c;让它们在道路上保持安全行驶是非常重要的。因此&#xff0c;当故障警示灯亮起时&#xff0c;我们需要迅速找到问题方向以及排除故障。 车辆的仪表板亮起多个故障灯以及警示灯&#xff0c;我们需要用解码器查找触…...

图论算法

目录 1.引言 2.图论基础 3.Dijkstra算法 3.1 算法背景与概述 3.2 算法原理 3.3 算法步骤 3.4 示例说明 3.5 复杂度分析 3.6 优缺点及应用场景 4.Floyd-Warshall算法 4.1 算法背景与概述 4.2 算法原理 4.3 算法步骤 4.4 示例说明 4.5 复杂度分析 4.6 优缺点及应用…...

手抖跟饮食有关系吗?

手抖&#xff0c;医学上称为震颤&#xff08;tremor&#xff09;&#xff0c;是指手部或其他身体部位的不自主抖动。饮食在某种程度上与手抖相关&#xff0c;但并非唯一的因素。以下是饮食与手抖之间可能存在的关系&#xff1a; 1. 咖啡因摄入&#xff1a;咖啡因是一种刺激神经…...