最小生成树求调
查看原帖
最小生成树求调
961972
Lele_Programmer楼主2025/7/21 19:01

Boruvka 求调

#include <bits/stdc++.h>
using namespace std;

#define _rep(i,a,b) for (int i=(a);i<=(b);++i)

namespace IO {
};

using namespace IO;

const int N=5005;
const int M=200005;
const int inf=1e9;

int n,m;
int st[N];
int p[N];

struct edge {
    int a,b,c;
    bool flag;
} arr[M];

int find(int x) {
    return (p[x]==x)?p[x]:(p[x]=find(p[x]));
}

int boruvka() {
    int ans=0;
    _rep(i,1,n) p[i]=i;
    while (true) {
        bool flag=false;
        _rep(i,1,m) {
            if (arr[i].flag) continue;
            if (arr[i].c<arr[st[find(arr[i].a)]].c) st[find(arr[i].a)]=i;
            if (arr[i].c<arr[st[find(arr[i].b)]].c) st[find(arr[i].b)]=i;
        }
        _rep(i,1,n) {
            if (!st[i]) continue;
            if (find(arr[st[i]].a)==find(arr[st[i]].b)) continue;
            flag=true;
            arr[st[i]].flag=true,ans+=arr[st[i]].c;
            p[find(arr[st[i]].a)]=find(arr[st[i]].b);
        }
        _rep(i,1,n) st[i]=0;
        if (!flag) break;
    }
    return ans;
}

int main() {
    read(n),read(m);
    _rep(i,1,m) {
        int a,b,c;
        read(a),read(b),read(c);
        arr[i]={a,b,c};
    }
    arr[0].c=inf;
    writeln(boruvka());
    return 0;
}
2025/7/21 19:01
加载中...