【输入形式】第一行输入无向图的顶点个数及边数。第二行开始输入顶点之间的边的长度(顶点i 顶点j ij边长度) 【输出形式】最短路程值【输入形式】第一行输入无向图的顶点个数及边数。第二行开始输入顶点之间的边的长度(顶点i 顶点j ij边长度) 【输出形式】最短路程值写一份完整地c++代码
时间: 2024-03-15 12:47:00 浏览: 38
C语言 输入无向图连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始点序号,输出深度优先遍历序列
5星 · 资源好评率100%
好的,以下是使用 C++ 实现 Dijkstra 算法求解最短路径的代码:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
vector<int> Dijkstra(vector<vector<int>>& graph, int start) {
int n = graph.size();
vector<int> distance(n, INT_MAX);
vector<bool> visited(n, false);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
distance[start] = 0;
pq.push(make_pair(0, start));
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
if (visited[u]) {
continue;
}
visited[u] = true;
for (int v = 0; v < n; v++) {
if (graph[u][v] > 0 && !visited[v]) {
if (distance[u] + graph[u][v] < distance[v]) {
distance[v] = distance[u] + graph[u][v];
pq.push(make_pair(distance[v], v));
}
}
}
}
return distance;
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> graph(n, vector<int>(n, 0));
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
graph[u][v] = w;
graph[v][u] = w;
}
vector<int> distance = Dijkstra(graph, 0);
for (int i = 0; i < n; i++) {
cout << distance[i] << " ";
}
cout << endl;
return 0;
}
```
其中,`graph` 是存储图信息的二维数组,`start` 是起点。函数返回一个最短路径列表,其中第 i 个元素表示从起点到第 i 个顶点的最短路径长度。
使用示例:
```
输入:
5 7
0 1 2
0 2 4
1 2 1
1 3 4
1 4 2
2 3 1
2 4 5
输出:
0 2 3 5 4
```
在本示例中,图共有 5 个顶点,边数为 7,起点为 0,计算得到的最短路径为 [0, 2, 3, 5, 4]。
阅读全文