输入有向图的相关信息,使用Dijkstra算法,求源点到其余顶点的最短路径长度。 注意: (1)使用邻接矩阵存储图的信息 (2)按路径长度递增的次序产生最短路径并输出 若源点到某顶点无路径,则放在最后输出。如:0到1无路径。c++实现,给出完整代码
时间: 2024-03-01 14:54:00 浏览: 64
以下是使用C++实现的Dijkstra算法求解源点到其余顶点的最短路径长度的代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 205;
const int INF = 0x3f3f3f3f;
int graph[MAXN][MAXN]; // 邻接矩阵存储图
int dis[MAXN]; // dis[i]表示源点到节点i的最短路径长度
bool vis[MAXN]; // vis[i]表示节点i是否已被加入最短路径树
int n, m; // n为节点数,m为边数
void dijkstra(int s) {
memset(dis, INF, sizeof(dis));
memset(vis, false, sizeof(vis));
dis[s] = 0;
for (int i = 1; i <= n; i++) {
int u = -1;
for (int j = 1; j <= n; j++) {
if (!vis[j] && (u == -1 || dis[j] < dis[u])) {
u = j;
}
}
vis[u] = true;
for (int v = 1; v <= n; v++) {
if (!vis[v] && graph[u][v] != INF) {
if (dis[u] + graph[u][v] < dis[v]) {
dis[v] = dis[u] + graph[u][v];
}
}
}
}
}
int main() {
cin >> n >> m;
memset(graph, INF, sizeof(graph));
for (int i = 1; i <= n; i++) {
graph[i][i] = 0; // 自身到自身距离为0
}
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
graph[u][v] = min(graph[u][v], w); // 若存在重边,取边权最小值
}
int s;
cin >> s; // 源点编号
dijkstra(s);
for (int i = 1; i <= n; i++) {
if (dis[i] == INF) {
cout << s << "到" << i << "无路径" << endl;
} else {
cout << s << "到" << i << "的最短路径长度为:" << dis[i] << endl;
}
}
return 0;
}
```
输入格式为节点数n和边数m,接下来m行每行三个整数u、v、w,表示有一条从u到v的边,边权为w。程序会输出源点到每个节点的最短路径长度,若源点到某节点不存在路径则输出“源点到该节点无路径”。
具体实现是使用贪心策略,每次从未加入最短路径树的节点中找到距离源点最近的节点u,将u加入最短路径树,并更新源点到其它节点的最短路径长度。时间复杂度为O(n^2)。
阅读全文