📜  门| GATE-CS-2017(套装1)|第 47 题(1)

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

门 | GATE-CS-2017(套装1)|第 47 题

这是一道考察图论算法的门问题。给定一个n个节点、m条边构成的无向图,同时给定两个节点s和t,我们需要找出在图中最少经过几条边可以从s到达t。如果s和t之间没有路径,则输出-1。

解法

这道题可以利用经典的BFS算法来解决。具体来说,我们从节点s开始,逐层向外扩散,直到找到节点t为止。这里需要注意的是,我们还需要记录每个节点是否已经被访问过,以避免重复访问。

def bfs(s, t):
    n = len(adj)
    q = deque([(s, 0)])
    visited = [False] * n
    visited[s] = True
    while q:
        node, dist = q.popleft()
        if node == t:
            return dist
        for next_node in adj[node]:
            if not visited[next_node]:
                visited[next_node] = True
                q.append((next_node, dist+1))
    return -1

注意这里,adj表示图的邻接表,它是一个长度为n的列表,其中每个元素表示节点i的邻居节点。例如,如果adj[0] = [1,2],那么节点0的邻居为节点1和节点2。可以利用这个邻接表,构建出无向图的数据结构。

另外,我们使用了一个队列q来存储每个已经访问过的节点。每次取出队首元素,然后遍历其邻居节点,将未访问过的节点加入队列,同时标记为已访问。需要注意的是,每个节点的距离是其父亲节点的距离+1。

总结

这是一道比较简单入门的图论算法题,利用BFS算法可以很快解决。对于初学者来说,这道题可以帮助加深对图的理解,同时掌握基本的BFS算法。