📜  门| GATE-CS-2016(套装2)|第 52 题(1)

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

题目

门| GATE-CS-2016(套装2)|第 52 题

介绍

这道题目考察的是图的遍历算法,需要我们实现一个广度优先搜索(BFS)算法。BFS算法是一种用于遍历或搜索树或图的算法,从根结点开始,每次尽可能地先访问距离起始点近的结点。其基本思想是:从起始结点开始,依次访问结点,将与当前结点相邻的未访问过的结点加入到队列中,直到队列为空。

题目描述:

给定一个连通的无向图,从第 $s$ 个顶点开始遍历。对于每个遍历到的顶点,我们输出其编号和该顶点遍历到时与起始顶点的距离。图的结点从 $1$ 到 $n$ 编号。

接下来的 $m$ 行表示该图的边,每一行包含两个整数 $u$ 和 $v$,表示该图存在一条从 $u$ 到 $v$ 的边。

我们需要实现以下函数:

def bfs(n: int, s: int, graph: List[List[int]]) -> List[Tuple[int, int]]:
    pass
输入

函数的输入参数有三个:

  • n:表示图中的顶点数量,$1 \le n \le 1000$。
  • s:表示从哪个顶点开始遍历,$1 \le s \le n$。
  • graph:表示无向图的邻接矩阵,其中 graph[i][j] 表示顶点 $i$ 和 $j$ 之间是否有边,$0$ 表示无边,$1$ 表示有边。
输出

函数的返回值为一个列表,其中每个元素为一个元组,表示图的遍历结果,其中第一个元素表示顶点编号,第二个元素表示该顶点遍历到时与起始顶点的距离。

示例

输入:

n = 4
s = 2
graph = [
    [0, 1, 1, 0],
    [1, 0, 1, 0],
    [1, 1, 0, 1],
    [0, 0, 1, 0],
]

输出:

[(2, 0), (1, 1), (3, 1), (4, 2)]
实现

以下是一个可能的实现(Python):

from typing import List, Tuple
from collections import deque

def bfs(n: int, s: int, graph: List[List[int]]) -> List[Tuple[int, int]]:
    # 遍历结果
    res = []
    # 标记每个顶点是否已经被访问过
    visited = [False] * n
    # 队列,保存待遍历的顶点
    q = deque()
    # 将起始顶点加入队列中
    q.append((s, 0))
    visited[s-1] = True
    # 遍历队列中的顶点
    while q:
        # 取出队首的顶点
        v, d = q.popleft()
        res.append((v, d))
        # 遍历与该顶点相邻的顶点
        for w in range(n):
            if graph[v-1][w] == 1 and not visited[w]:
                q.append((w+1, d+1))
                visited[w] = True
    return res

该算法使用队列来保存待遍历的顶点,用一个列表 visited 来标记每个顶点是否已经被访问过。初始时,将起始顶点加入到队列中并标记为已访问,然后依次取出队列中的顶点,并将与其相邻的未访问过的顶点加入到队列中,直到队列为空。

总结

本题考察了图的遍历算法,特别是广度优先搜索算法。BFS算法是图的基本遍历算法之一,也是解决最短路径等问题的基础。熟练掌握该算法对于工程师而言是非常重要的。实现BFS算法可以使用队列来保存待遍历的顶点,在遍历时依次取出队列中的顶点,将其相邻的未访问过的顶点加入到队列中,直到队列为空。