📅  最后修改于: 2023-12-03 15:10:05.773000             🧑  作者: Mango
在图中找到任意一对两个不同的好节点之间的最短距离,问题本质上是查找两个点之间的最短路径,通常可使用图遍历算法来解决。
图可采用邻接矩阵或邻接表进行存储。在邻接矩阵中,使用二维数组表示每个节点之间的边,空间复杂度为O(V^2);而邻接表只需保存每个节点所连接的边即可,空间复杂度为O(E),更适合稀疏图。
从图的某个节点出发,沿着一条边一直走到底,直到无法继续搜索。若还有未被访问的节点,则回溯到上一个节点继续遍历,直至所有节点都被遍历完。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可用来查找最短路径,时间复杂度同样为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。