编写一个程序exp8-7.cpp,实现求带权无向图中单源最短路径的迪克斯特拉算法
时间: 2024-03-16 12:41:20 浏览: 98
好的,以下是程序exp8-7.cpp的代码实现:
```c++
#include <iostream>
#include <cstring>
using namespace std;
#define MAXN 1005
#define INF 0x3f3f3f3f
int n, m, s, t;
int map[MAXN][MAXN], dis[MAXN], vis[MAXN];
void Dijkstra(int s) {
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++) {
dis[i] = (i == s ? 0 : INF);
}
for (int i = 1; i <= n; i++) {
int k = -1, minn = INF;
for (int j = 1; j <= n; j++) {
if (!vis[j] && dis[j] < minn) {
k = j;
minn = dis[j];
}
}
if (k == -1) break;
vis[k] = 1;
for (int j = 1; j <= n; j++) {
if (!vis[j] && dis[k] + map[k][j] < dis[j]) {
dis[j] = dis[k] + map[k][j];
}
}
}
}
int main() {
cin >> n >> m >> s >> t;
memset(map, INF, sizeof(map));
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
map[u][v] = map[v][u] = w;
}
Dijkstra(s);
cout << dis[t] << endl;
return 0;
}
```
程序中使用了一个邻接矩阵来存储图的信息,其中`map[i][j]`表示点i到点j的边的权值(如果不存在则为INF)。`Dijkstra`函数实现了Dijkstra算法的过程,其中`dis[i]`表示源点s到点i的最短路径长度,`vis[i]`表示点i是否已经被访问过。在每一轮循环中,首先找出未被访问过的最小距离的点k,然后将k标记为已访问,更新与k相邻的点的最短路径长度。最终,`dis[t]`即为源点s到目的地t的最短路径长度。
需要注意的是,本程序中的邻接矩阵是采用了INF来表示不存在的边,这里的INF可以根据具体情况设置为一个较大的数,确保其大于所有边的权值之和。
阅读全文