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的相互转化。

posted @ 2026-04-10 20:26  十七code  阅读(12)  评论(1)    收藏  举报