代码随想录| 图论04 查并集 ●查并集理论知识 ●1971.寻找图中是否存在路径 ●684.冗余连接 ●685.冗余连接II

#查并集理论知识

 

并查集用处:解决连通性问题

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

思路:将三个元素A,B,C (分别是数字)放在同一个集合,其实就是将三个元素连通在一起,如何连通:只需要用一个一维数组来表示,即:father[A] = B,father[B] = C 这样就表述 A 与 B 与 C连通了(有向连通图)。如果几个元素的根是同一个,代表在同一集合。

find的路径压缩:

就需要 路径压缩,将非根节点的所有节点直接指向根节点

路径压缩长一点写:

int find(int u) {if (u == father[u]) return u;else return father[u] = find(father[u]); // 路径压缩
}

 路径压缩短一点写:

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

 随想录的查并集模板:

int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好
vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化
void init() {for (int i = 0; i < n; ++i) {father[i] = i;}
}
// 并查集里寻根的过程
int find(int u) {return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩
}// 判断 u 和 v是否找到同一个根
bool isSame(int u, int v) {u = find(u);v = find(v);return u == v;
}// 将v->u 这条边加入并查集
void join(int u, int v) {u = find(u); // 寻找u的根v = find(v); // 寻找v的根if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回father[v] = u;
}

# 1971.寻找图中是否存在路径  并查集基础题目

我用dfs做的,自己处理edge信息,梦回3343 3391了

void dfs(int start, int dest, vector<vector<int>>& edges, vector<vector<int>> &path, vector<bool> &v,bool &flag){if(start==dest){flag=true;return;}v[start]=true;for(int i=0;i<path[start].size();i++){if(!v[path[start][i]]) dfs(path[start][i], dest,edges,path,v,flag);}}bool validPath(int n, vector<vector<int>>& edges, int source, int dest) {vector<vector<int>> path(n);vector<bool> v(n,false);bool flag=false;for(int i=0;i<edges.size();i++){//edges[i] = [ui, vi]   edges[i][0] edges[i][1]path[edges[i][0]].push_back(edges[i][1]);path[edges[i][1]].push_back(edges[i][0]);}dfs(source,dest,edges,path,v,flag);return flag;}

查并集做法:(要把模板学会记住)自己写的:

    int n=200001;vector<int> father=vector<int> (n,0);void init(){for(int u=0;u<n;u++) father[u]=u;}int find(int u){if(u==father[u]) return u;return 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) father[u]=v;}bool validPath(int n, vector<vector<int>>& edges, int source, int dest) {init();for(int i=0;i<edges.size();i++){join(edges[i][0],edges[i][1]);}return isSame(source,dest);}

记住,所有函数最外面这么写会错:

int n=200001;

vector<int> father(n,0); 

但是vector<int> father = vector<int>(n,0);  这样写就可以(我不知道为什么

因为:在C++中,同一个编译单元(通常就是一个源文件)内的全局变量的初始化顺序是不确定的。编译器可能以任何顺序初始化它们,这个顺序通常取决于编译器的实现,是不可预测的。


#684.冗余连接 

我没想到思路

判断成环:已经有同样的根,但是又来一个edge连接两者。

join易错点:最后一步 father[u]=v, father[v]=u 都可以,但是被赋值的一定要是father,不能反

int n=1001;vector<int> father=vector<int>(n,0);void init(){for(int u=0;u<n;u++) father[u]=u;}int find(int u){if(u==father[u]) return u;return father[u]=find(father[u]);}void join(int u, int v){u=find(u);v=find(v);if(u!=v) father[v]=u;}bool isSame(int u, int v){u=find(u);v=find(v);return u==v;}vector<int> findRedundantConnection(vector<vector<int>>& edges) {init();for(int i=0;i<edges.size();i++){if(isSame(edges[i][0],edges[i][1])) return edges[i];join(edges[i][0],edges[i][1]);}return {};}

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

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

相关文章

Python 算法基础篇:插入排序和希尔排序

Python 算法基础篇&#xff1a;插入排序和希尔排序 引言 1. 插入排序算法概述2. 插入排序算法实现实例1&#xff1a;插入排序 3. 希尔排序算法概述4. 希尔排序算法实现实例2&#xff1a;希尔排序 5. 插入排序与希尔排序的对比总结 引言 插入排序和希尔排序是两种常用的排序算法…

017-从零搭建微服务-系统服务(四)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&#xff1a;https://gitee.com/csps…

【实战】 七、Hook,路由,与 URL 状态管理(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十三)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

el-upload将上传的图片转为base64

el-upload将上传的图片转为base64 文章目录 el-upload将上传的图片转为base641. el-upload属性设置2. 图片转base64格式方法3. 在绑定的方法中调用 elementui使用el-upload时将选择的图片转为base64格式,然后再上传 1. el-upload属性设置 使用组件&#xff0c;然后on-change绑定…

【NLP】如何使用Hugging-Face-Pipelines?

一、说明 随着最近开发的库&#xff0c;执行深度学习分析变得更加容易。其中一个库是拥抱脸。Hugging Face 是一个平台&#xff0c;可为 NLP 任务&#xff08;如文本分类、情感分析等&#xff09;提供预先训练的语言模型。 本博客将引导您了解如何使用拥抱面部管道执行 NLP 任务…

代码随想录算法训练营day45 70.爬楼梯(进阶) 322.零钱兑换 279.完全平方数

题目链接70.爬楼梯(进阶) class Solution {public int climbStairs(int n) {int[] dp new int[n1];int m 2;dp[0] 1;for(int i 1; i < n; i){for(int j 1; j < m; j){if(i > j)dp[i] dp[i-j];}}return dp[n];} }题目链接322.零钱兑换 class Solution {public …

超详细图文教程:3DS Max 中创建低多边形游戏长剑模型

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在此&#xff0c;由两部分组成的教程的第一部分中&#xff0c;我将向您展示如何&#xff1a; 对剑柄进行建模剑的护手模型剑刃建模 1. 如何制作剑柄 步骤 1 在本教程中使用正交视图。要更改视图&#x…

python安装OpenCV

安装OpenCV pip install opencv-pythonpython OpenCV 打开摄像头 import cv2WIDTH 1080 HEIGHT 720cap cv2.VideoCapture(0, cv2.CAP_DSHOW) cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)while True:ok,frame cap.read()# pri…

阿里巴巴前端开发规范

前言 规范的目的是为了编写高质量的代码&#xff0c;让你的团队成员每天的心情都是愉悦的&#xff0c;大家在一起是快乐的。 现在软件架构的复杂性需要协同开发完成&#xff0c;如何高效地协同呢&#xff1f;无规矩不成方圆&#xff0c;无规范难以协同&#xff0c;比如&#xf…

机器学习概念

文章目录 一、机器学习概念1. 机器学习基本概念2. 基于规则的学习3. 基于模型学习4. 机器学习数据集描述二、机器学习分类1. 监督学习1.1 分类问题1.2 回归问题2. 无监督学习2.1 聚类问题2.2 数据降维3. 半监督学习4. 强化学习三、拟合问题1. 欠拟合2. 过拟合3. 奥卡姆剃刀原则…

Android:aidl简单应用

创建aidl文件&#xff1a;IMyAidlInterface.aidl Build-> Clean Project 重新编译下项目 生成IMyAidlInterface.class文件 interface IMyAidlInterface { void basicTypes(int jk); } --MyService public class MyService extends Service { //定义音乐…

AI时代带来的图片造假危机,该如何解决

一、前言 当今&#xff0c;图片造假问题非常泛滥&#xff0c;已经成为现代社会中一个严峻的问题。随着AI技术不断的发展&#xff0c;人们可以轻松地通过图像编辑和AI智能生成来篡改和伪造图片&#xff0c;使其看起来真实而难以辨别&#xff0c;之前就看到过一对硕士夫妻为了骗…

uni-app:页面跳转

uni.navigateTo: 不关闭当前页面&#xff0c;跳转到一个新页面。 uni.redirectTo: 关闭当前页面&#xff0c;跳转到应用中的某个页面。 uni.reLaunch: 关闭所有页面&#xff0c;打开应用中的某个页面。 uni.switchTab: 跳转到应用的底部选项卡页面。 uni.navigateBack: 返回上一…

Flink-端到端精确一次(End-To-End Exactly-Once)

1.总结 目的&#xff1a;想要在故障恢复后不丢数据 输入端 保证可以重复发送数据如果是kafka&#xff0c;Flink负责维护offset&#xff0c;不用kafka维护设置kafka的隔离级别为&#xff1a;读已提交flink 开启检查点采用对齐或者不对齐的精确一次输出端 kafka 幂等事务两阶段…

一文了解Python中的while循环语句

目录 &#x1f969;循环语句是什么 &#x1f969;while循环 &#x1f969;遍历猜数字 &#x1f969;while循环嵌套 &#x1f969;while循环嵌套案例 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;Python从入门到精通专栏 循环语句是什…

Mysql表锁与行锁

Mysql锁实战 前言&#xff1a;什么是锁一&#xff1a;全局锁1.1 概念1.2 作用1.3 使用1.4 特点 二&#xff1a;表级锁2.1 概念2.2 分类2.2.1 表锁2.2.2 元数据锁 MDL2.2.3 意向锁 三&#xff1a;行级锁3.1 行锁(Record Lock)3.2 间隙锁(Gap Lock)3.3 临键锁(Next-Key Lock): 四…

C# 委托详解

一.委托的概念 C#中委托也叫代理&#xff0c;委托提供了后期绑定机制(官方解释)&#xff0c;功能类似于C中的函数指针&#xff0c;它存储的就是一系列具有相同签名和返回类型的方法的地址&#xff0c;调用委托的时候&#xff0c;它所包含的所有方法都会被执行。 二.委托的用法…

自然语言处理基础详解入门

1、自然语言的概念 自然语言是指人类社会约定俗成的&#xff0c;并且区别于人工语言&#xff08;如计算机程序&#xff09;的语言&#xff0c;&#xff0c;是自然而然的随着人类社会发展演变而来的语言&#xff0c;它是人类学习生活的重要工具。 2、自然语言处理概述 自然语言…

Redis【实践篇】之RedisTemplate基本操作

Redis 从入门到精通【应用篇】之RedisTemplate详解 文章目录 Redis 从入门到精通【应用篇】之RedisTemplate详解0. 前言1. RedisTemplate 方法1. 设置RedisTemplate的序列化方式2. RedisTemplate的基本操作 2. 源码浅析2.1. 构造方法2.2. 序列化方式2.3. RedisTemplate的操作方…

【数据可视化】基于Python和Echarts的中国经济发展与人口变化可视化大屏

1.题目要求 本次课程设计要求使用Python和ECharts实现数据可视化大屏。要求每个人的数据集不同&#xff0c;用ECharts制作Dashboard&#xff08;总共至少4图&#xff09;&#xff0c;要求输入查询项&#xff08;地点和时间&#xff09;可查询数据&#xff0c;查询的数据的地理…