写一段c++代码,要求如下:建立一个带权无向图的邻接矩阵存储,用迪杰斯特拉(Dijkstra)算法求该图中给定的某起点到某终点之间的最短路径,按顺序输出该最短路径上的各顶点。(注意:用32767表示无穷大) 【输入形式】 顶点个数 边的条数 顶点数据 边 权值 起始顶点 终止顶点 【输出形式】 边的序列 【样例输入】 5 5 A B C D E AB 5 AD 6 BE 3 EC 4 DC 7 A C 【样例输出】 ABEC
时间: 2024-03-12 21:49:57 浏览: 117
C++求所有顶点之间的最短路径(用Dijkstra算法)
以下是符合要求的C++代码,其中使用了邻接矩阵存储无向图,Dijkstra算法求最短路径:
```c++
#include <iostream>
#include <cstring>
#define INF 32767
using namespace std;
const int MAXN = 100;
int n; // 顶点个数
int m; // 边的条数
char vertex[MAXN]; // 顶点数据
int edge[MAXN][MAXN]; // 边权值
int dist[MAXN]; // 存储起点到各点的最短距离
bool vis[MAXN]; // 标记顶点是否已被访问
// Dijkstra算法求最短路径
void dijkstra(int s, int t) {
memset(vis, false, sizeof(vis));
memset(dist, INF, sizeof(dist)); // 初始化距离为无穷大
// 将起点到自身的距离设为0
dist[s] = 0;
// 找到剩余未访问的顶点中距离起点最近的顶点u
for (int i = 0; i < n; i++) {
int u = -1;
int minDist = INF;
for (int j = 0; j < n; j++) {
if (!vis[j] && dist[j] < minDist) {
u = j;
minDist = dist[j];
}
}
if (u == -1) {
break;
}
// 标记顶点u为已访问
vis[u] = true;
// 更新起点到剩余未访问的顶点的距离
for (int v = 0; v < n; v++) {
if (!vis[v] && edge[u][v] != INF && dist[u] + edge[u][v] < dist[v]) {
dist[v] = dist[u] + edge[u][v];
}
}
}
// 打印起点到终点的最短路径上的各顶点
int path[MAXN];
int pathLen = 0;
int curr = t;
while (curr != s) {
path[pathLen++] = curr;
for (int i = 0; i < n; i++) {
if (edge[i][curr] != INF && dist[curr] - edge[i][curr] == dist[i]) {
curr = i;
break;
}
}
}
path[pathLen++] = s;
for (int i = pathLen - 1; i >= 0; i--) {
cout << vertex[path[i]];
}
}
int main() {
cin >> n >> m;
memset(edge, INF, sizeof(edge)); // 初始化边权值为无穷大
// 读入顶点数据
for (int i = 0; i < n; i++) {
cin >> vertex[i];
}
// 读入边和边权值
char u, v;
int w;
for (int i = 0; i < m; i++) {
cin >> u >> v >> w;
int x = u - 'A';
int y = v - 'A';
edge[x][y] = edge[y][x] = w; // 无向图
}
// 读入起点和终点
char s, t;
cin >> s >> t;
int start = s - 'A';
int end = t - 'A';
dijkstra(start, end);
return 0;
}
```
阅读全文