用C++编写一段程序,实现以下功能:用一个函数初始化一个有向图,随机选择一个点作为源点,然后输出这个有向图中到每个点的最短路
时间: 2023-12-10 13:42:41 浏览: 78
谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )
5星 · 资源好评率100%
以下是使用 Dijkstra 算法实现的 C++ 代码,可以实现初始化有向图、随机选择源点和输出每个点的最短路:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <ctime>
#include <cstdlib>
using namespace std;
const int INF = 0x3f3f3f3f; // 定义无穷大
// 定义 Edge 类表示边
class Edge {
public:
int to, w;
Edge(int to, int w) : to(to), w(w) {}
};
// 定义 Graph 类表示有向图
class Graph {
public:
int n; // 顶点数
vector<vector<Edge>> adj; // 邻接表
Graph(int n) : n(n) {
adj.resize(n);
}
// 添加一条从 u 到 v 权值为 w 的边
void addEdge(int u, int v, int w) {
adj[u].emplace_back(v, w);
}
// 随机选择一个源点
int randomSource() {
srand(time(NULL));
return rand() % n;
}
// Dijkstra 算法求单源最短路径
vector<int> shortestPath(int s) {
vector<int> dist(n, INF); // 到源点的距离
dist[s] = 0; // 源点到自己的距离为 0
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 小根堆
pq.emplace(0, s); // 将源点加入小根堆
while (!pq.empty()) {
auto [d, u] = pq.top(); // 取出堆顶元素
pq.pop();
if (dist[u] < d) continue; // 如果 u 的最短路径已经被更新过了,就跳过当前循环
for (auto& e : adj[u]) { // 遍历 u 的所有邻居
int v = e.to, w = e.w;
if (dist[v] > dist[u] + w) { // 如果通过 u 能够更新 v 的最短路径
dist[v] = dist[u] + w; // 更新 v 的最短路径
pq.emplace(dist[v], v); // 将 v 加入小根堆
}
}
}
return dist;
}
};
int main() {
int n, m;
cin >> n >> m; // 输入顶点数和边数
Graph g(n);
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w; // 输入一条边的信息
g.addEdge(u, v, w); // 添加这条边到图中
}
int s = g.randomSource(); // 随机选择一个源点
vector<int> dist = g.shortestPath(s); // 求最短路径
cout << "源点:" << s << endl;
for (int i = 0; i < n; i++) {
cout << "到 " << i << " 的最短路为:" << dist[i] << endl;
}
return 0;
}
```
注意:该程序使用了 C++17 的结构化绑定,需要编译器支持。如果编译器不支持该特性,可以将 `auto [d, u] = pq.top();` 改为 `auto p = pq.top(); int d = p.first, u = p.second;`。
阅读全文