第十一章 图论 Part5

目录
  • 并查集理论基础
    • 思路
  • 任务
    • 1971. 寻找图中是否存在路径
      • 思路一
      • 思路二

并查集理论基础

思路

用一维数组来维护这样的结构,数组的索引表示某个值,数组的值表示该索引同一集合的根

# n 根据题目中的节点数量而定,一般比节点数量大一点就好
n = 1005
father = [0] * n  # Python 中列表的初始大小为 n,并用 0 填充# 并查集初始化
def init():for i in range(n):father[i] = i# 并查集里寻根的过程
def find(u):if u == father[u]:return uelse:father[u] = find(father[u])  # 路径压缩return father[u]# 判断 u 和 v 是否找到同一个根
def is_same(u, v):u = find(u)v = find(v)return u == v# 将 v->u 这条边加入并查集
def join(u, v):u = find(u)  # 寻找 u 的根v = find(v)  # 寻找 v 的根if u == v:return  # 如果发现根相同,说明在一个集合,不用两个节点相连,直接返回father[v] = u

任务

1971. 寻找图中是否存在路径

有一个具有 n 个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。

请你确定是否存在从顶点 source 开始,到顶点 destination 结束的 有效路径 。

给你数组 edges 和整数 n、source 和 destination,如果从 source 到 destination 存在 有效路径 ,则返回 true,否则返回 false 。

思路一

第一个想到的是dfs(之前解过求两个点之间的所有路径),由于是找是否存在,所以是有返回值的dfs,此时考虑类树形DP,下层告诉上层是否找到路径。

class Solution:def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:# 将边集转化为邻接表graph = defaultdict(list)for a,b in edges:graph[a].append(b)graph[b].append(a)visited = [False] * nreturn self.dfs(graph,source,destination,visited)# 有返回值的dfs,有点类似于树形DPdef dfs(self,graph,start,end,visited):visited[start] = Trueif start == end: #终止条件在终点return Truefor i in graph[start]:if not visited[i]:if self.dfs(graph,i,end,visited): #如果下层返回True,则本层向上返回True,表示找到到达终点的路径return Truereturn False

思路二

本章所学的并查集正好对应这道题,只要在一条边上,就归为同一集合,连续的边的连接归为同一集合(该集合内的点都能到达),最后判断source和des是否为同一集合即可。

class Solution:def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:unionFind = UnionFind(n)for i in range(len(edges)):unionFind.join(edges[i][0],edges[i][1])return unionFind.is_same(source,destination)class UnionFind:def __init__(self,n):self.father = [0] * nfor i in range(n):self.father[i] = i# (查) def find(self,u): if u == self.father[u]:return uelse:self.father[u] = self.find(self.father[u])  # 路径压缩(一直像上层返回最底层的值,并且一直赋值)return self.father[u]# 判断 u 和 v 是否找到同一个根def is_same(self,u, v): u = self.find(u)v = self.find(v)return u == v# 将 v->u 这条边加入并查集 (并)def join(self,u, v):u = self.find(u)  # 寻找 u 的根v = self.find(v)  # 寻找 v 的根if u == v:return  # 如果发现根相同,说明在一个集合,不用两个节点相连,直接返回self.father[v] = u #否则其中一根归于另一根

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

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

相关文章

1-9Java数组

Java 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。 Java 语言中提供的数组是用来存储固定大小的同类型元素。 你可以声明一个数组变量,如 numbers[100] 来代替直接声明 100 个独立变量 number0,number1,....,numbe…

VR虚拟现实解决方案在电商行业中的7大优势

从电子商务的角度来看,虚拟现实可以通过多种方式为在线卖家带来好处。VR 可带来身临其境、富有创意且令人难忘的客户体验,可以极大地提高转化率。VR 可以通过更多方式使卖家受益。从电子商务的角度来看,虚拟现实可以通过多种方式为在线卖家带来好处。VR 可带来身临其境、富有…

Mathematica 入门

前言 Wolfram Mathematica(简称 MMA),是由 Wolfram Research 开发的科学计算软件。本文我们将介绍 Mathematica 的界面、语法和基本应用。类似的软件还有 MATLAB 和 Maple 等。 MMA 官网:https://www.wolfram.com/mathematica/ MMA 的安装及激活:Mathematica安装激活极简教…

【算法笔记】位运算详解

0. 前言 突然想到位运算是个好东西,就来水一波文章了…… 注意:我把能想到的有关位运算的所有内容都放进来了,所以篇幅较长,请谅解!若有写的不清楚或者不够详细的地方欢迎在评论区补充,谢谢支持! 本文中参考代码均使用C++编写。 废话不多说,下面步入正题。1. 基本运算 …

【算法笔记】【专题】RMQ 问题:ST表/树状数组/线段树

0. 前言 好久没更算法笔记专栏了,正好学了新算法来更新…… 这也是本专栏的第一个专题问题,涉及到三种数据结构,如果写得有问题请各位大佬多多指教,谢谢! 1. 关于 RMQ 问题 RMQ 的全称是 Range Minimum/Maximum Query,即区间最大/最小值问题。 本文中,我们的算法以求最大…

【算法笔记】树形DP算法总结详解

0. 定义 树形DP,又称树状DP,即在树上进行的DP,是DP(动态规划)算法中较为复杂的一种。 1. 基础 令\(f[u]=~\)与树上顶点\(u\)有关的某些数据,并按照拓扑序(从叶子节点向上到根节点的顺序)进行\(\text{DP}\),确保在更新一个顶点时其子节点的dp值已经被更新好,以更新当前…

Seay安装和初步使用

作者网站现在已经无法访问:http://www.cnseay.com/2951/, 可以使用这个GitHub - f1tz/cnseay: Seay源代码审计系统 下载完安装包之后,解压到自己想要的电脑路径即可,无需进行任何额外的配置 利用工具对sql注入进行分析 进入软件之后,点击新建项目,选择需要分析的文件(这里…

纸浆

日线: 小时线: 15分钟趋势: 关注5750一线支撑

代码整洁之道--读书笔记(5)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

02网络参考模型

02网络参考模型02网络参考模型常见网络模型因为 OSI协议栈比较复杂 ,且TCP和IP两大协议在业界被广泛使用,所以 TCP/IP参考模型 成为了互联网的主流参考模型。OIS网络模型层级作用7.应用层 应用层 对应用程序提供接口。6.表示层进行数据格式的转换,以确保一个系统生成的应用层…

《痞子衡嵌入式半月刊》 第 107 期

痞子衡嵌入式半月刊: 第 107 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

鼠标悬停显示的轮播图

今日整理,发现这种轮播图是最难实现的一种, 1.再循环中难以控制单一品类商品显示 解决办法: 在外面的主类里面添加&:hover触发标签属性的更改,这样可以单一作用 2.在循环中触发事件,所有的同一事件都会触发 解决办法:先建立模版控制排版,再从单一内容开始微调 <script s…