裸的最小生成树,带并查集的克鲁斯卡尔算法,为什么这么水的题目我要写题解,大概是为了达目标的打卡吧
# include <cstdio>
# include <cstring>
# include <cctype>
# include <cmath>
# include <cstdlib>
# include <climits>
# include <iostream>
# include <iomanip>
# include <set>
# include <map>
# include <vector>
# include <stack>
# include <queue>
# include <algorithm>
using namespace std;
const int debug = 1;
const int size = 5000 + 10;
const int INF = INT_MAX>>1;
typedef long long ll;
typedef pair<int, int> pir;
// first to, second v
struct DisjointSet{
int *T,size,sum;
int FindRoot(int i){
return T[i] < 0 ? i : T[i] = FindRoot(T[i]);
}
DisjointSet(){}
DisjointSet(int _size):size(_size){
T = new int[size];
Init();
}
void Init(){sum = size;memset(T,-1,sizeof(int)*size);}
bool Unioned(int i,int j){return FindRoot(i)==FindRoot(j);}
int Union(int i,int j){
if ( (i = FindRoot(i) ) != ( j = FindRoot(j) ) ){
T[i] = T[i] + T[j];
T[j] = i;
sum--;
}
return -T[i];
}
int GetSum(int i){return -T[FindRoot(i)];}
};
typedef pair<int, int> pir;
vector<pir> edge;
vector<int> w;
int main(){
// std::ios::sync_with_stdio(false);cin.tie(0);
int n, m; cin >> n >> m;
DisjointSet Dst(n);
priority_queue<pir, vector<pir>, greater<pir> > pri_que;
while (m--){
int a, b, c; cin >> a >> b >> c;
edge.push_back(pir(a, b));
w.push_back(c);
pri_que.push(pir(c, w.size()-1));
}
int ans = 0;
while (!pri_que.empty()){
pir T = pri_que.top(); pri_que.pop();
int i = edge[T.second].first;
int j = edge[T.second].second;
if (!Dst.Unioned(i, j)){
Dst.Union(i, j);
ans += T.first;
}
}
cout << ans << endl;
return 0;
}

京公网安备 11010502036488号