编写一个程序实现求带权无向图中单源最短路径的迪克斯特拉算法
时间: 2024-03-16 17:41:23 浏览: 77
python实现有向图单源最短路径迪杰斯特拉 算法
好的,以下是程序的代码实现:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f // 表示正无穷
const int MAXN = 1005;
int n, m; // n表示顶点个数,m表示边数
int s, t; // s表示源点,t表示终点
vector<pair<int, int>> graph[MAXN]; // 邻接表存图
int dist[MAXN]; // 存储源点到各个点的最短距离
// 迪杰斯特拉算法
void dijkstra(int s) {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
memset(dist, INF, sizeof(dist));
dist[s] = 0;
pq.push(make_pair(0, s));
while (!pq.empty()) {
int d = pq.top().first;
int u = pq.top().second;
pq.pop();
if (d > dist[u]) continue;
for (int i = 0; i < graph[u].size(); i++) {
int v = graph[u][i].first;
int w = graph[u][i].second;
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.push(make_pair(dist[v], v));
}
}
}
}
int main() {
cin >> n >> m >> s >> t;
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
graph[u].push_back(make_pair(v, w));
graph[v].push_back(make_pair(u, w)); // 无向图,所以需要反向添加边
}
dijkstra(s);
cout << dist[t] << endl;
return 0;
}
```
程序中使用了邻接表来存储图的信息。其中,`graph[i]`表示以点i为起点的边的集合,每条边用`(v, w)`来表示,表示从点i到点v的边的权值为w。
在`dijkstra`函数中,使用了一个小根堆(优先队列)来保存未被访问的点,每次取出距离源点最近的点u,然后遍历以u为起点的所有边,如果用u到v的距离加上源点到u的距离比源点到v的距离更小,则更新源点到v的距离,并将v加入小根堆中。
最终,`dist[t]`即为源点s到终点t的最短路径长度。
需要注意的是,本程序中使用了一个`INF`常量表示正无穷,其值可以根据具体情况设置为一个足够大的数。
阅读全文