思路:用结构体 e 存边,sort 排序,从小到大把边收入,并用并查集表示其端点是否收入。
//要注意e是边的长度
const int inf=999999999;
int n,m,q,fa[1010];
struct edge{
int x,y,len;
}e[20005];
bool cmp(edge a,edge b){
return a.len<b.len;
}
int find(int x){
return fa[x] != x ? fa[x] = find(fa[x]) : x;
}
int kruskal(){
for(int i=0;i<=n;i++)
fa[i]=i;
sort(e,e+m,cmp);
int cnt=0;
int sum=0;
for(int i=0;i<m;i++){
int x=e[i].x,y=e[i].y;
int t1=find(e[i].x);
int t2=find(e[i].y);
if(t1!=t2){
sum+=e[i].len;
fa[t2]=t1;
cnt++;
}
if(cnt==n-1)
break;
}
if(cnt<n-1)
return -1;
else
return sum;
}