最小生成树(整理篇)
prim
#include <bits/stdc++.h>
using namespace std;
const int N = 400500, INF = 2147483647;
typedef pair<int, int> PII;
bool st[N];
int n, m, dist[N], tot, ans;;
vector<PII> q[N];
void prim() {
fill(dist, dist + 1 + n, INF);
dist[1] = 0, dist[0] = INF;
while(true) {
int u = 0;
for(int i = 1; i <= n; ++ i) {
if(!st[i] && dist[i] < dist[u]) {
u = i;
}
}
if(!u) break;
++ tot;
st[u] = 1;
ans += dist[u];
for(auto & [v, w] : q[u]) {
if(dist[v] > w) {
dist[v] = w;
}
}
}
}
int main() {
cin >> n >> m;
for(int i = 1; i <= m; ++ i) {
int a, b, c;
cin >> a >> b >> c;
q[a].emplace_back(b, c), q[b].emplace_back(a, c);
}
prim();
if(tot == n) cout << ans;
else puts("orz");
return 0;
}
kruskal
#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
struct edge {
int u, v, w;
}e[N];
int fa[N], n, m, ans, cnt;
bool cmp(edge a, edge b) {
return a.w < b.w;
}
int find(int x) {
if(x != fa[x]) return fa[x] = find(fa[x]);
return x;
}
void kruskal() {
sort(e + 1, e + m + 1, cmp);
for(int i = 1; i <= m; ++ i) {
int u = find(e[i].u), v = find(e[i].v);
if(u == v) {
continue;
}
ans += e[i].w;
fa[v] = u;
cnt ++;
}
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; ++ i) fa[i] = i;
for(int i = 1; i <= m; ++ i) {
cin >> e[i].u >> e[i].v >> e[i].w;
}
kruskal();
if(cnt == n - 1) cout << ans;
else puts("orz");
return 0;
}
浙公网安备 33010602011771号