dijkstra求最短路c++
时间: 2023-10-11 17:09:52 浏览: 106
Dijkstra算法是求单源最短路径的经典算法,其基本思想是通过逐步扩展生成最短路径集合,最终得到源点到所有其它点的最短路径。
以下是C++实现:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int INF = 0x3f3f3f3f; // 定义正无穷
struct Edge {
int to, w;
Edge(int to, int w) : to(to), w(w) {}
};
vector<Edge> G[100010]; // 邻接表存图
int dist[100010]; // 存储最短路径长度
bool vis[100010]; // 标记是否已经确定最短路径
void dijkstra(int s) {
memset(dist, INF, sizeof(dist)); // 初始化距离为正无穷
memset(vis, false, sizeof(vis)); // 初始化标记为未确定最短路径
dist[s] = 0; // 源点到自己的距离为0
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q; // 小根堆
q.push(make_pair(0, s)); // 将源点入队
while(!q.empty()) {
int u = q.top().second; // 取出当前距离最小的点
q.pop();
if(vis[u]) continue; // 如果已经确定最短路径,直接跳过
vis[u] = true; // 标记为已确定最短路径
for(auto e : G[u]) { // 遍历所有相邻的点
int v = e.to;
int w = e.w;
if(dist[v] > dist[u] + w) { // 如果当前路径更优
dist[v] = dist[u] + w; // 更新最短路径距离
q.push(make_pair(dist[v], v)); // 将该点加入小根堆
}
}
}
}
int main() {
int n, m, s;
cin >> n >> m >> s;
for(int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
G[u].push_back(Edge(v, w));
}
dijkstra(s);
for(int i = 1; i <= n; i++) {
if(dist[i] == INF) cout << "INF" << endl; // 如果不连通,输出INF
else cout << dist[i] << endl;
}
return 0;
}
```
输入格式:第一行输入三个整数n,m,s,表示图的点数、边数和源点编号。接下来m行每行三个整数u,v,w,表示一条从u到v的有向边,边权为w。
输出格式:输出n行,每行一个整数,表示源点到每个点的最短路径长度。若不连通,则输出INF。
阅读全文