OVSolitario-io

导航

最小生成树(整理篇)

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;
}

posted on 2025-11-22 22:40  TBeauty  阅读(2)  评论(0)    收藏  举报