1 介绍
朴素版prim算法的关键步骤:
- 选距离生成树最近的结点。
- 最近结点加入生成树。
- 更新非生成树结点到生成树的距离(即更新minDist数组)。
朴素版prim算法的时间复杂度为O(n^2),它用来解决稠密图的最小生成树问题。
2 训练
#include <bits/stdc++.h>
using namespace std;
const int N = 510;
int n, m;
int mindist[N];
bool st[N];
unordered_map<int,vector<pair<int,int>>> g;
void prim() {
memset(mindist, 0x3f, sizeof mindist);
memset(st, 0, sizeof st);
mindist[1] = 0;
for (int k = 0; k < n; ++k) {
//选n个结点
int a = -1;
int minv = 0x3f3f3f3f;
for (int i = 1; i <= n; ++i) {
if (st[i] == false && minv > mindist[i]) {
a = i;
minv = mindist[i];
}
}
if (minv == 0x3f3f3f3f) {
cout << "impossible" << endl;
return;
}
st[a] = true;
for (auto [b, w] : g[a]) {
if (st[b] == false && mindist[b] > w) {
mindist[b] = w;
}
}
}
long long res = 0;
for (int i = 1; i <= n; ++i) {
res += mindist[i];
}
cout << res << endl;
return;
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; ++i) {
int a, b, w;
cin >> a >> b >> w;
g[a].emplace_back(make_pair(b,w));
g[b].emplace_back(make_pair(a,w));
}
prim();
return 0;
}