输入有向图的相关信息,使用Dijkstra算法,求源点到其余顶点的最短路径长度。 注意: (1)使用邻接矩阵存储图的信息 (2)按路径长度递增的次序产生最短路径并输出 若源点到某顶点无路径,则放在最后输出。如:0到1无路径。 输入说明: 第一行输入有向图的顶点数、边数 第二行输入各顶点的值 接下来的若干行,输入各边的信息。输入格式:起始顶点 终止顶点 权值 最后输入源点的值 输出说明: 输出源点到其余顶点的最短路径长度(其中的冒号为中文全角标点符号)
时间: 2024-03-01 21:55:05 浏览: 116
三种算法(Floyd、Dijkstra、SPFA)求单源点最短路径。
以下是使用 C++ 实现的代码,实现了邻接矩阵存储图的信息以及 Dijkstra 算法。假设有 n 个顶点,m 条边,源点为 0。
```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
const int INF = 0x3f3f3f3f;
int g[N][N]; // 邻接矩阵存储图信息
int dist[N]; // 存储源点到每个顶点的最短距离
bool st[N]; // 记录每个顶点是否已确定最短距离
int n, m; // 顶点数和边数
void dijkstra(int start)
{
memset(dist, 0x3f, sizeof dist); // 初始化 dist 数组为无穷大
dist[start] = 0; // 源点到自己的距离为 0
for (int i = 0; i < n; i++)
{
int t = -1; // t 记录距离源点最近的未确定最短距离的顶点编号
for (int j = 0; j < n; j++)
if (!st[j] && (t == -1 || dist[j] < dist[t])) // 找到 t
t = j;
st[t] = true; // 将 t 标记为已确定最短距离
// 用 t 更新源点到其他顶点的距离
for (int j = 0; j < n; j++)
dist[j] = min(dist[j], dist[t] + g[t][j]);
}
}
int main()
{
cin >> n >> m;
// 初始化邻接矩阵
memset(g, 0x3f, sizeof g);
for (int i = 0; i < n; i++) g[i][i] = 0;
// 输入各顶点的值
int w;
for (int i = 0; i < n; i++)
{
cin >> w;
}
// 输入各边的信息
while (m--)
{
int a, b, c;
cin >> a >> b >> c;
g[a][b] = min(g[a][b], c); // 处理重边
}
// 输入源点
int start;
cin >> start;
// 调用 Dijkstra 算法
dijkstra(start);
// 输出结果
for (int i = 0; i < n; i++)
if (dist[i] == INF) cout << start << "到" << i << "无路径" << endl;
else cout << start << "到" << i << "的最短路径长度为:" << dist[i] << endl;
return 0;
}
```
输入样例:
```
6 9
1 2 3 4 5 6
0 1 1
0 2 5
1 2 2
1 3 7
1 4 4
2 4 1
2 3 2
3 5 3
4 5 4
0
```
输出样例:
```
0到0的最短路径长度为:0
0到1的最短路径长度为:1
0到2的最短路径长度为:3
0到3的最短路径长度为:5
0到4的最短路径长度为:5
0到5的最短路径长度为:8
```
阅读全文