第1关:实现prim算法
时间: 2023-10-28 10:09:34 浏览: 153
Prim算法和Kruskal算法的Matlab实现[归纳].pdf
Prim算法是一种用于在加权无向图中寻找最小生成树的算法,它的基本思想是从一个点开始,每次找到与当前生成树最近的一个点加入到生成树中,直到生成树包含所有点为止。下面是Prim算法的实现代码:
```
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 1005;
struct Edge {
int to, cost;
Edge(int _to, int _cost) : to(_to), cost(_cost) {}
};
vector<Edge> G[MAXN];
int dist[MAXN];
bool used[MAXN];
int prim(int n, int s) {
memset(dist, INF, sizeof(dist));
memset(used, false, sizeof(used));
dist[s] = 0;
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> que;
que.push(make_pair(0, s));
int res = 0;
while (!que.empty()) {
int v = que.top().second;
que.pop();
if (used[v]) continue;
used[v] = true;
res += dist[v];
for (int i = 0; i < G[v].size(); i++) {
int u = G[v][i].to;
int cost = G[v][i].cost;
if (!used[u] && dist[u] > cost) {
dist[u] = cost;
que.push(make_pair(dist[u], u));
}
}
}
return res;
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b, w;
cin >> a >> b >> w;
G[a].push_back(Edge(b, w));
G[b].push_back(Edge(a, w));
}
int ans = prim(n, 1);
cout << ans << endl;
return 0;
}
```
这里使用了一个优先队列来维护距离最小的点,同时还需要用一个数组来记录每个点的距离和是否已经加入生成树。
阅读全文