Menu
CoddyTech

BFS

Coddy 图:数据结构系列 #9 课程的第 10 课,共 14 课。

接下来的挑战会用到你刚刚创建的 Graph 类。

每个挑战都会提供一个锁定的 graph 文件(上一章最终版本的 Graph),以及一个新的 solution 文件,你可以在其中编写一个使用 Graph 的函数。

我们的第一个算法是:广度优先搜索。从一个顶点开始,BFS 会分层访问所有可达顶点:先访问起点,然后访问距离起点一条边的所有顶点,再访问距离起点两条边的所有顶点,依此类推。经典实现会使用队列:先将起点入队,然后反复出队,将该顶点记录为已访问,并将所有尚未访问的邻居入队。

由于邻居列表没有固定顺序,两次正确的 BFS 运行可能会产生不同的遍历顺序。为了让这个挑战的答案具有确定性,请在将每个顶点的邻居入队之前,按升序排序。

challenge icon

挑战

简单

编写一个函数 bfs,接收一个二维 int 数组 adjacency(每一行都是一条 [u, v] 边)和一个 int start,并返回从 start 开始的 BFS 访问顺序,结果为 int 列表。

构建图:对于 adjacency 中的每个 [u, v],调用 g.addEdge(u, v)。然后使用队列从 start 开始进行 BFS。处理顶点的邻居时,按升序排序,确保输出结果固定。

必须使用 Graph 类(在 graph 中提供),不要使用语言内置类型(映射、集合)来表示邻接关系。算法的辅助数据(已访问集合、队列)可以使用标准库类型。

亲手试试

#include <stdio.h>
#include "solution.h"

int main() {
    int n, m, start;
    if (scanf("%d %d %d", &n, &m, &start) != 3) return 0;
    int adjacency[1024][2];
    for (int i = 0; i < m; i++) scanf("%d %d", &adjacency[i][0], &adjacency[i][1]);
    int out[MAX_VERTICES];
    int outn = bfs(adjacency, m, start, out);
    for (int i = 0; i < outn; i++) {
        if (i > 0) printf(" ");
        printf("%d", out[i]);
    }
    printf("\n");
    return 0;
}

图:数据结构系列 #9中的所有课

自己练习: C 在线编译器