最短路算法
最短路求源点到其他点或任意两点的最小路径权。算法选择取决于边权是否非负、是否有负环以及图的规模。
Dijkstra:非负边
维护当前最短的未确定点,每次从小根堆取距离最小的点并松弛其出边。非负权保证该点距离已最终确定。
priority_queue<pair<long long,int>,vector<pair<long long,int>>,greater<>> pq;
pq.push({0,s});
while(!pq.empty()){auto [d,u]=pq.top();pq.pop(); if(d!=dist[u]) continue;
for(auto [v,w]:g[u]) if(dist[v]>d+w)
dist[v]=d+w,pq.push({dist[v],v});
}
其他算法
- BFS:边权全为 1 的单源最短路,O(n+m)。
- Bellman-Ford:可处理负边,连续第 n 次仍可松弛说明存在从源可达的负环,O(nm)。
- SPFA:队列式松弛,实践可能快但最坏 O(nm),不可作为稳定复杂度保证。
- Floyd:
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]),全源 O(n³)。
初始化 dist[s]=0、其余为 INF;松弛前确保前项不是 INF。若需还原路径,记录每次更新的前驱。整理自 XOJ《最短路算法》。