每日经典一题——蓝桥杯

1.题目内容

2.思路导向

这道题是要找图中是否存在从source到destination的路径。那题目描述里说这是一个双向图,也就是边是无向的。
那首先,应该考虑用图的遍历方法,比如深度优先搜索(DFS)或者广度优先搜索(BFS)吧。这两种方法都可以用来查找两个节点之间是否有路径存在。

也可以用并查集(Union-Find)结构来处理,因为并查集适合处理连通性问题。

3.并查集(Union-Find)方法思路

3.1 并查集初始化:每个顶点的父节点初始化为自身。

3.2合并操作:遍历所有边,将相连的两个顶点合并到同一个集合中。

3.3查找操作:检查 source 和 destination 的根节点是否相同。如果相同,说明它们在同一个连通分量中,存在有效路径;否则不存在。

解决代码

class Solution:
    def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:
        parent = list(range(n))
        
        def find(x):
            while parent[x] != x:
                parent[x] = parent[parent[x]]  # 路径压缩
                x = parent[x]
            return x
        
        def union(x, y):
            fx, fy = find(x), find(y)
            if fx != fy:
                parent[fy] = fx
        
        for u, v in edges:
            union(u, v)
        
        return find(source) == find(destination)

4.代码解释
4.1 并查集初始化:parent 数组初始化为每个顶点的父节点为自身。

4.2 查找函数 find:使用路径压缩优化,使得每次查找操作后树的高度降低,提高后续查找效率。

4.3 合并函数 union:将两个顶点所在的集合合并,确保合并后的集合具有相同的根节点。

4.4 遍历边并合并:对于每条边,将两个顶点合并到同一个集合中。

4.5 判断连通性:最后检查 source 和 destination 的根节点是否相同,从而确定是否存在有效路径。

5.图的遍历(如 BFS 或 DFS)实现。

5.1 构建邻接表:将图的边转换为邻接表形式,方便遍历。

5.2 BFS 遍历:从 source 开始,逐层遍历相邻节点,若找到 destination 则返回 True;若遍历完成未找到则返回 False。

5.3 记录访问状态:使用数组记录已访问的节点,避免重复遍历。

解决代码

from collections import deque
from typing import List

class Solution:
    def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:
        if source == destination:
            return True
        
        # 构建邻接表
        adj = [[] for _ in range(n)]
        for u, v in edges:
            adj[u].append(v)
            adj[v].append(u)
        
        visited = [False] * n
        queue = deque([source])
        visited[source] = True
        
        while queue:
            node = queue.popleft()
            for neighbor in adj[node]:
                if neighbor == destination:
                    return True
                if not visited[neighbor]:
                    visited[neighbor] = True
                    queue.append(neighbor)
        
        return False

6.代码解释
邻接表构建:通过遍历 edges 数组,将每个顶点的相邻顶点存入邻接表 adj。

BFS 初始化:使用队列 queue 存储待访问节点,初始时将 source 加入队列,并标记为已访问。

遍历过程:从队列取出节点,遍历其所有相邻节点。若相邻节点是 destination,直接返回 True;否则将未访问的相邻节点加入队列并标记为已访问。

终止条件:若队列为空仍未找到 destination,返回 False。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值