O ( E lgE )
适用于 稀疏图
struct Edge{
int from,to,cost;
}edge[m];
int fa[n];
void init(){ // 不用并查集的kruskal算法是废的
for(int i=1;i<=n;i++)
fa[i]=i;
}
int find(int p){
while(fa[p]!=p){
fa[p]=fa[fa[p]];
p=fa[p];
}
return p;
}
bool connect(int x,int y){ // y加到x那,如果本来就在,返回false
x=find(x);
y=find(y);
if(x==y)return false;
fa[y]=x;
return true;
}
bool cmp(Edge a,Edge b){
return a.cost<b.cost;
}
int kruskal(){
int ans=0,tot=0;
init();
sort(edge,edge+m,cmp);
for(int i=0;i<m;i++){
if(connect(edge[i].from,edge[i].to)){
ans+=edge[i].cost;
tot++;
}
}
if(tot<n-1)return -1;
return ans;
}