最短路是什么
约 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 版复杂度 。坑: 初值设 或极大值表示"未到达",直接用它判断是否已访问,别再另开 搞混。
小纸条
边权不同时还能用广搜吗?
登录 后可看答案