Menu
CoddyTech

最短路径

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

从 start 到 end 最少需要经过多少条边?在无权图中(每条边的代价都相同),答案正是 BFS 计算出的结果。因为 BFS 会按照与起点距离递增的顺序访问顶点,所以第一次到达 end 时,经过的就是一条最短路径。

诀窍是将每个顶点和当前距离一起加入队列。先加入 (start, 0)。每当你从距离为 d 的顶点发现一个新邻居 v 时,就将 (v, d + 1) 加入队列。当 v == end 时,返回 d + 1。

有两种边界情况。如果 start == end,答案是 0。如果 BFS 结束时仍未到达 end,那么这两个顶点位于不同的连通分量中,答案是 -1。

challenge icon

挑战

简单

编写一个函数 shortestPath,它接收一个二维 int 数组 adjacency、一个 int start 和一个 int end,并返回从 start 到 end 的最短距离(边数)。

  • 如果 start == end,返回 0。
  • 如果从 start 无法到达 end,返回 -1。
  • 否则,返回它们之间的最少边数。

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

亲手试试

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

int main() {
    int n, m, start, end;
    if (scanf("%d %d %d %d", &n, &m, &start, &end) != 4) return 0;
    int adjacency[1024][2];
    for (int i = 0; i < m; i++) scanf("%d %d", &adjacency[i][0], &adjacency[i][1]);
    printf("%d\n", shortestPath(adjacency, m, start, end));
    return 0;
}

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

自己练习: C 在线编译器