📅  最后修改于: 2023-12-03 14:58:29.001000             🧑  作者: Mango
这是一道关于树的题目,题目要求我们给定一颗树和树上的两个节点,然后找出它们之间的最短路径的长度。我们可以使用BFS解决这个问题,其基本思路如下:
在BFS中,每次从队列中弹出一个节点并检查它是否为目标节点之一。
如果是,返回当前步数。否则,将当前节点的所有邻居入队并更新它们的步数。
重复步骤1和步骤2,直到找到两个目标节点之一。
在这个具体的问题中,我们可以用一个数组$dist$来记录每个节点到根节点的距离,使用$parent$数组来记录每个节点的父节点。这两个数组是在构建树时进行维护的,因此只需要遍历整棵树一次即可,时间复杂度为$O(N)$。
然后我们实现一个BFS函数,在这个函数中,我们同时处理两个目标节点。首先将它们分别插入队列,然后依次弹出队列中的节点。当检查到目标节点时,我们就交换它们的顺序——目标节点2现在是队列中的第一个。因此,我们总是先处理它。
一旦找到两个节点,我们就可以返回它们之间的距离。我将代码片段标记为markdown格式如下:
def bfs(root, target1, target2):
dist = [0] * N
parent = [None] * N
visited = [False] * N
q = []
q.append(target1)
q.append(target2)
visited[target1] = True
visited[target2] = True
while len(q) != 0:
curr = q.pop(0)
if curr == target2:
tmp = target1
target1 = target2
target2 = tmp
for neighbor in adj[curr]:
if not visited[neighbor]:
visited[neighbor] = True
q.append(neighbor)
parent[neighbor] = curr
dist[neighbor] = dist[curr] + 1
if neighbor == target1 or neighbor == target2:
if dist[curr] + dist[neighbor] < 2*ans:
ans = (dist[curr] + dist[neighbor]) // 2
return ans