参考文章图解:什么是最小生成树?
vector<int> parents;
int count;
void init(int n){
count = n+1;
parents = vector<int>(n+1, 0);
for(int i=0; i<=n; ++i){
parents[i] = i;
}
}
int find(int x){
if(x != parents[x])
return find(parents[x]);
return parents[x];
}
void Union(int x, int y){
int rootX = find(x);
int rootY = find(y);
if(rootX == rootY)
return ;
parents[rootX] = rootY;
count--;
}
bool isConnected(int x, int y){
return find(x) == find(y);
}
/*
输入:
n, 节点数量
connections, {{a, b, w}} 无向图中的起点、终点、权重
*/
int minimumCost(int n, vector<vector<int>>& connections) {
sort(connections.begin(), connections.end(), [&](vector<int>& a, vector<int>& b){
return a[2] < b[2];
});
init(n);
int ans = 0;
for(int i=0; i<connections.size(); ++i){
int x,y,w;
x = connections[i][0];
y = connections[i][1];
w = connections[i][2];
if(! isConnected(x, y)){
Union(x, y);
ans += w;
}
}
return count == 2? ans : -1;
}