class UnionBySize{
public:
vector<int>parent;
vector<int>size;
UnionBySize(int s){
parent.resize(s);
size.resize(s,1);
for(int i=0;i<s;i++){
parent[i]=i;
}
}
bool Union(int node,int nei){
int p1=getParent(node);
int p2=getParent(nei);
if(p1==p2)return false;
int s1=size[p1];
int s2=size[p2];
if(s1>s2)
{
parent[p2]=node;
size[p1]+=size[p2];
}
else {
parent[p1]=nei;
size[p2]+=size[p1];
}
return true;
}
int getParent(int node){
if(parent[node]==node)return node;
return parent[node]=getParent(parent[node]);
}
};
class Solution {
public:
int spanningTree(int V, vector<vector<int>>& edges) {
// code here
sort(edges.begin(), edges.end(), [](vector<int> &a, vector<int> &b) {
return a[2] < b[2]; // ascending
});
UnionBySize u(V);
int ans=0;
for(auto e:edges){
bool res=u.Union(e[0],e[1]);
if(res)ans+=e[2];
}
return ans;
}
};
No comments:
Post a Comment