最短路是什么

10 分钟

从起点走到终点,让路径上边权之和最小,就是最短路。当所有边权都相等(比如都是 )时,BFS 就是最短路算法——BFS 按层扩展,第一次到达某个点时经过的边数一定最少。

// 边权全为 1:BFS 求最短距离
queue<int> q;
q.push(s); dis[s] = 0;
while (!q.empty()) {
    int u = q.front(); q.pop();
    for (int v : g[u])
        if (dis[v] == -1) {          // 还没到达过
            dis[v] = dis[u] + 1;     // 第一次到 = 最短
            q.push(v);
        }
}

边权不一样时不能直接用 BFS:先到不等于最短,一条"边多但每条都很短"的路可能反而更近。这时要用 Dijkstra(非负权,配优先队列 )或 SPFA/Bellman-Ford(能处理负权)。BFS 版复杂度 。坑: 初值设 或极大值表示"未到达",直接用它判断是否已访问,别再另开 搞混。

小纸条

边权不同时还能用广搜吗?

登录 后可看答案

最短路是什么 · 考级冲刺 · op599 课程