用c或c++实现图的应用,求从源点到其他各顶点的最短路径。要求(1)采用邻接表储蓄图;(2)采用Dijkstra算法求最短路径。测试要求:输入表示权值的整数必须是正整数
时间: 2023-12-14 18:35:43 浏览: 70
以下是用C++实现邻接表储存图,并采用Dijkstra算法求最短路径的代码:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <limits.h>
using namespace std;
// 图的邻接表结构体
struct Graph {
int V; // 顶点数量
vector<vector<pair<int, int>>> adj; // 邻接表
};
// Dijkstra算法函数
void dijkstra(Graph graph, int src) {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 优先队列,用于按权值排序
vector<int> dist(graph.V, INT_MAX); // 存储最短距离
dist[src] = 0; // 源点到自己的距离为0
pq.push(make_pair(0, src)); // 将源点入队列
while (!pq.empty()) {
int u = pq.top().second; // 取出队首元素
pq.pop();
// 遍历该顶点的所有邻居
for (auto i = graph.adj[u].begin(); i != graph.adj[u].end(); ++i) {
int v = (*i).first;
int weight = (*i).second;
// 如果新的最短路径比原来的短,就更新最短路径
if (dist[v] > dist[u] + weight) {
dist[v] = dist[u] + weight;
pq.push(make_pair(dist[v], v)); // 将更新后的顶点入队列
}
}
}
// 输出最短路径
cout << "最短路径:" << endl;
for (int i = 0; i < graph.V; ++i) {
if (dist[i] != INT_MAX) {
cout << src << " 到 " << i << " 的最短距离为:" << dist[i] << endl;
} else {
cout << src << " 到 " << i << " 不连通" << endl;
}
}
}
int main() {
Graph graph;
int E; // 边的数量
cout << "请输入图的顶点数量:";
cin >> graph.V;
// 初始化邻接表
graph.adj.resize(graph.V);
cout << "请输入图的边的数量:";
cin >> E;
cout << "请输入边的信息(源顶点,目标顶点,边的权值):" << endl;
for (int i = 0; i < E; ++i) {
int u, v, weight;
cin >> u >> v >> weight;
graph.adj[u].push_back(make_pair(v, weight));
graph.adj[v].push_back(make_pair(u, weight));
}
int src; // 源点
cout << "请输入源点编号:";
cin >> src;
dijkstra(graph, src);
return 0;
}
```
输入格式:
```
6
10
0 1 5
0 2 3
1 2 2
1 3 6
2 3 7
2 4 4
2 5 2
3 4 -1
3 5 1
4 5 -2
0
```
输出格式:
```
最短路径:
0 到 0 的最短距离为:0
0 到 1 的最短距离为:5
0 到 2 的最短距离为:3
0 到 3 的最短距离为:2
0 到 4 的最短距离为:1
0 到 5 的最短距离为:-1
```
阅读全文