C++最短路径(Dijkstra)随笔
在求单源最短路径时,通常使用到Dijkstra算法来解决相关问题,该算法核心在于:
从起点出发发,逐步向外扩展,每次选择距离起点最近且未被访问的节点,对该节点的邻节点进行松弛操作(更新邻节点到起点的最短距离)重复以上步骤直至所有节点被访问
具体代码模板展示:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main() {
int n, m, s, t;
cin >> n >> m >> s >> t;
vector <pair<int, int>> adj[2501];
priority_queue <pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> heap;//利用小根堆,每次取堆中最新值
vector <bool> st(n+1, false);
vector <int> dist(n+1, 0x3f3f3f3f);
for (int i = 0;i < m;i++) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({ v,w });
adj[v].push_back({ u,w });//无向图
}
dist[s] = 0;
heap.push({ 0,s });//初始化
while (!heap.empty()) {
auto tem = heap.top();
heap.pop();
int d = tem.first;
int u = tem.second;
if(st[u])continue;
st[u]=true;
//松弛操作 核心点!!!
for (auto x : adj[u]) {
int a = x.first;
int b = x.second;
if (dist[a] > dist[u] + b) {
dist[a] = dist[u] + b;
heap.push({ dist[a],a });
}
}
}
cout << dist[t] << endl;
return 0;
}
值得注意的是,其中堆是根据节点间的距离(即x.first) 自动排序,而在adj中first是节点 ,second才是距离,写代码时需注意。此外,如果题目中需输入地名(string)而非数字作为节点,可以使用map进行string和int的相互转化。

浙公网安备 33010602011771号