输入有向图的相关信息,使用Dijkstra算法,求源点到其余顶点的最短路径长度。 注意: (1)使用邻接矩阵存储图的信息 (2)按路径长度递增的次序产生最短路径并输出 若源点到某顶点无路径,则放在最后输出。如:0到1无路径。 输入说明: 第一行输入有向图的顶点数、边数 第二行输入各顶点的值 接下来的若干行,输入各边的信息。输入格式:起始顶点 终止顶点 权值 最后输入源点的值 输出说明: 输出源点到其余顶点的最短路径长度(其中的冒号为中文全角标点符号)用c++写
时间: 2024-03-01 20:53:56 浏览: 54
以下是使用C++编写的代码,该程序使用了邻接矩阵来存储有向图的信息,并使用Dijkstra算法求出源点到各个顶点的最短路径长度:
```c++
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <climits>
using namespace std;
// 邻接矩阵存储图的信息
const int MAX_VALUE = INT_MAX; // 表示两个节点之间没有边
vector<vector<int>> graph;
vector<int> dist; // 存储源点到各个节点的最短路径长度
vector<bool> visited; // 存储节点的访问状态
int main() {
int n, m;
cin >> n >> m;
vector<string> nodes(n);
map<string, int> index;
for (int i = 0; i < n; i++) {
cin >> nodes[i];
index[nodes[i]] = i;
}
graph.resize(n, vector<int>(n, MAX_VALUE));
for (int i = 0; i < n; i++) {
graph[i][i] = 0; // 自己到自己的距离为0
}
for (int i = 0; i < m; i++) {
string start, end;
int weight;
cin >> start >> end >> weight;
int start_index = index[start], end_index = index[end];
graph[start_index][end_index] = weight;
}
string source;
cin >> source;
// Dijkstra算法
// 初始化dist和visited数组
dist.resize(n);
visited.resize(n);
for (int i = 0; i < n; i++) {
dist[i] = graph[index[source]][i];
visited[i] = false;
}
visited[index[source]] = true;
for (int i = 1; i < n; i++) { // 遍历n-1个节点
int min_dist = MAX_VALUE;
int min_index = -1;
// 找到未访问节点中距离源点最近的节点
for (int j = 0; j < n; j++) {
if (!visited[j] && dist[j] < min_dist) {
min_dist = dist[j];
min_index = j;
}
}
if (min_index == -1) { // 未找到可达节点
break;
}
visited[min_index] = true;
// 更新源点到未访问节点的距离
for (int j = 0; j < n; j++) {
if (!visited[j] && dist[j] > dist[min_index] + graph[min_index][j]) {
dist[j] = dist[min_index] + graph[min_index][j];
}
}
}
// 按路径长度递增的次序产生最短路径并输出
for (int i = 0; i < n; i++) {
if (dist[i] == MAX_VALUE) {
cout << source << "到" << nodes[i] << "无路径" << endl;
} else {
cout << source << "到" << nodes[i] << "的最短路径长度为:" << dist[i] << endl;
}
}
return 0;
}
```
示例输入:
```
5 8
A B C D E
A B 10
A C 3
B C 1
B D 2
C B 4
C D 8
C E 2
D E 7
A
```
示例输出:
```
A到A的最短路径长度为:0
A到B的最短路径长度为:7
A到C的最短路径长度为:3
A到D的最短路径长度为:5
A到E的最短路径长度为:5
```
阅读全文