📅  最后修改于: 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算法可以使用队列来保存待遍历的顶点,在遍历时依次取出队列中的顶点,将其相邻的未访问过的顶点加入到队列中,直到队列为空。