c++上机实现最小生成树算法prim
时间: 2023-09-03 07:15:17 浏览: 113
Prim算法是一种解决加权无向连通图的最小生成树问题的算法。下面是C++上机实现Prim算法的代码:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
const int MAXV = 1000; // 最大顶点数
const int INF = INT_MAX; // 无穷大
vector<pair<int, int>> adj[MAXV]; // 邻接表存图
bool visited[MAXV]; // 记录顶点是否已加入生成树
int dist[MAXV]; // 记录当前生成树到各顶点的最短距离
int prim(int s, int n) {
// s为起点,n为顶点数
for (int i = 0; i < n; i++) {
visited[i] = false;
dist[i] = INF;
}
dist[s] = 0;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 小根堆
pq.push(make_pair(dist[s], s));
int ans = 0; // 记录最小生成树的权值和
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
if (visited[u]) continue;
visited[u] = true;
ans += dist[u];
for (auto v : adj[u]) {
if (!visited[v.first] && v.second < dist[v.first]) {
dist[v.first] = v.second;
pq.push(make_pair(dist[v.first], v.first));
}
}
}
return ans;
}
int main() {
int n, m;
cin >> n >> m; // n为顶点数,m为边数
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w; // 输入一条边的两个端点和权值
adj[u].push_back(make_pair(v, w));
adj[v].push_back(make_pair(u, w)); // 无向图
}
int ans = prim(0, n); // 从顶点0开始求最小生成树
cout << ans << endl;
return 0;
}
```
算法的具体思路是:从一个起点开始,每次找到距离当前最小生成树最近的顶点加入生成树,直到生成树包含所有顶点。在寻找最近顶点时,可以使用小根堆优化时间复杂度。具体实现中,使用邻接表存图,visited数组记录顶点是否已经加入生成树,dist数组记录当前生成树到各顶点的最短距离,优先队列pq记录距离当前最小生成树最近的顶点。
阅读全文