最短路算法 dijkstra 从认识到熟练掌握
参考资料:
(这里鸣谢代码随想录的分享)
Dijkstra算法,你的最短路来了!(认识dijkstra)
Dijkstra算法,求最短路还能更快!(堆优化版)
个人总结的代码
下面的代码可以AC P4779 【模板】单源最短路径(标准版) - 洛谷
相信你通过上面的参考资料或者下面的代码总结属于你自己的dijkstra
#include <bits/stdc++.h>
using namespace std;
class Dist{
public:
int u;
int d;
Dist(int u_, int d_):u(u_),d(d_){}
bool operator < (const Dist &other) const{
return d > other.d;// 小顶堆
}
};
void solve() {
int n, m, start; // n为顶点 m为边数
cin >> n >> m >> start;
priority_queue<Dist> q;
vector<Dist> g[n + 1];
for (int i = 0; i < m; ++i) {
int u, v, w;
cin >> u >> v >> w;
g[u].push_back(Dist(v, w));
}
vector<bool> vis(n + 1, false);
vector<int> dis(n + 1, INT_MAX);
q.push(Dist(start, 0));
dis[start] = 0;
while (!q.empty()) {
Dist cur = q.top();
q.pop();
int u = cur.u;
if(vis[u]) continue;
vis[u] = true;
for(auto &next:g[u]){
int v = next.u;
if(dis[v] > dis[u] + next.d){
dis[v] = dis[u] + next.d;
q.push(Dist(v, dis[v]));
}
}
}
for(int i = 1;i<=n;i++){
cout<<dis[i]<<" ";
}
}
int main() {
#ifdef ACM_LOCAL
freopen("data.in", "r", stdin);
// freopen("data.out", "w", stdout);
#endif
int T = 1;
// cin >> T;
while (T--) {
solve();
}
return 0;
}
题单
会不断更新的
- Heavy Transportation (flowus.cn)
- 模版 P4779 【模板】单源最短路径(标准版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
- [ABC218F] Blocked Roads (flowus.cn)
- [ABC237E]滑雪 — [ABC237E] Skiing (flowus.cn)
- 2.蓝桥王国 - 蓝桥云课 (lanqiao.cn)
- 743. 网络延迟时间
- 3419. 图的最大边权的最小值
- L2-001 紧急救援 - 团体程序设计天梯赛-练习集