📌  相关文章
📜  找到任意一对两个不同的好节点之间的最短距离(1)

📅  最后修改于: 2023-12-03 15:10:05.773000             🧑  作者: Mango

找到任意一对两个不同的好节点之间的最短距离

在图中找到任意一对两个不同的好节点之间的最短距离,问题本质上是查找两个点之间的最短路径,通常可使用图遍历算法来解决。

图的存储

图可采用邻接矩阵或邻接表进行存储。在邻接矩阵中,使用二维数组表示每个节点之间的边,空间复杂度为O(V^2);而邻接表只需保存每个节点所连接的边即可,空间复杂度为O(E),更适合稀疏图。

图遍历算法
  • 深度优先搜索(DFS)

从图的某个节点出发,沿着一条边一直走到底,直到无法继续搜索。若还有未被访问的节点,则回溯到上一个节点继续遍历,直至所有节点都被遍历完。DFS的时间复杂度为O(V+E)。

visited = [False]*n
def dfs(v, graph, visited):
    visited[v] = True
    for i in graph[v]:
        if not visited[i]:
            dfs(i, graph, visited)
# 调用方式:
dfs(start_node, graph, visited)
  • 广度优先搜索(BFS)

从某个节点出发,先访问其所有相邻节点,再访问相邻节点的相邻节点,以此类推。BFS可用来查找最短路径,时间复杂度同样为O(V+E)。

def bfs(start_node, graph):
    visited = [False]*n
    queue = [start_node]
    visited[start_node] = True
    while queue:
        v = queue.pop(0)
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True
# 调用方式:
bfs(start_node, graph)
寻找两个好节点之间的最短距离

根据题意,我们只需要找到任意一对好节点间的最短距离,因此我们可使用广度优先搜索来实现。从一个好节点出发,找到距离其最近的下一个好节点,即可得到最短距离。若没有下一个好节点,则该好节点无法到达其他好节点。

def shortest_distance(start_node, good_nodes, graph):
    distance = [-1]*n
    visited = [False]*n
    queue = [start_node]
    visited[start_node] = True
    distance[start_node] = 0
    while queue:
        v = queue.pop(0)
        if v in good_nodes:
            return distance[v]
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True
                distance[i] = distance[v] + 1
    # 若无法到达其他好节点,则返回-1
    return -1

# 调用方式:
good_nodes = [1, 3, 5]
shortest_distance(start_node, good_nodes, graph)

使用 BFS 算法进行遍历,判断当前节点是否是好节点(即在列表 good_nodes 中)。若是,则返回距离;若不是,则继续遍历。若不存在好节点,则返回 -1。