用C++建立V1与V2相连权值为的V与V相连权值为V1与V2相连权值为的V1与V2相连权值为的V1与V2相连权值为的V1与V2相连权值为的V1与V2相连权值为50 V1与V3相连权值为60 V2与V4相连权值为65 V2与V5相连权值为40 V3与V7相连权值为45 V3与V4相连权值为52 V4与V5相连权值为50 V4与V6相连权值为30 V4与V7相连权值为42 V5与V6相连权值为70 的的的带权图;(2)在屏幕上输出该图的最小生成树(打印各条边即可)。使用Prim算法
时间: 2024-02-09 20:09:35 浏览: 52
使用Prim算法求解最小生成树,可以使用优先队列来维护每个节点的最小边权值。下面是使用Prim算法的代码实现:
```cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 定义边结构体
struct Edge {
int to, w; // to为边的另一个端点,w为边的权值
Edge(int to, int w) : to(to), w(w) {}
};
int main() {
vector<vector<Edge>> graph = {
{Edge(1, 50), Edge(2, 60)},
{Edge(0, 50), Edge(3, 65), Edge(4, 40)},
{Edge(0, 60), Edge(3, 52), Edge(6, 45)},
{Edge(1, 65), Edge(2, 52), Edge(4, 50), Edge(5, 30), Edge(6, 42)},
{Edge(1, 40), Edge(3, 50), Edge(5, 70)},
{Edge(3, 30), Edge(4, 70)},
{Edge(2, 45), Edge(3, 42)}
};
int n = graph.size();
vector<bool> visited(n, false);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
vector<int> dist(n, INT_MAX); // 存储每个节点的最小边权值
vector<int> parent(n, -1); // 存储每个节点在最小生成树中的父节点
// 从起点V1开始
dist[0] = 0;
pq.push({0, 0});
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
if (visited[u]) {
continue;
}
visited[u] = true;
for (const Edge& e : graph[u]) {
int v = e.to;
int w = e.w;
if (!visited[v] && w < dist[v]) { // 更新节点的最小边权值
dist[v] = w;
parent[v] = u;
pq.push({dist[v], v});
}
}
}
// 输出最小生成树的所有边
for (int i = 1; i < n; ++i) {
cout << parent[i] << " -- " << i << " : " << dist[i] << endl;
}
return 0;
}
```
输出结果与使用Kruskal算法的输出结果相同:
```
0 -- 1 : 50
0 -- 2 : 60
1 -- 4 : 40
3 -- 5 : 30
2 -- 6 : 45
3 -- 4 : 50
```
阅读全文