📜  门| GATE-CS-2014-(Set-2) |第 65 题(1)

📅  最后修改于: 2023-12-03 14:58:29.001000             🧑  作者: Mango

GATE-CS-2014-(Set-2) |第 65 题

这是一道关于树的题目,题目要求我们给定一颗树和树上的两个节点,然后找出它们之间的最短路径的长度。我们可以使用BFS解决这个问题,其基本思路如下:

  1. 在BFS中,每次从队列中弹出一个节点并检查它是否为目标节点之一。

  2. 如果是,返回当前步数。否则,将当前节点的所有邻居入队并更新它们的步数。

  3. 重复步骤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