描述
给定无向图跟(V,E),连接G种所有点,且边集是E的子集的权值最小的树。
题解
边排序之后,第i小的边的序号保存在r[i]中(间接排序,排序的关键字是对象的“代号”,而不是对象本身)。
r[]初始化为{1,2,3,4,5,6},经过排序后变成{2,4,5,3,1,6}。r[0]=2,代表最小的边为原始数据的第二条边。
代码
#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define maxn1 105
#define maxn2 105
struct node{
int u,v,w;
}G[maxn1];
int n,m,r[maxn2],p[maxn1];
int find_(int x){
return p[x]==x?x:p[x]=find_(p[x]);
}
int cmp(const int i,const int j){
return G[i].w<G[j].w;
}
int main()
{
while(scanf("%d%d",&n,&m)==1){
int ans=0;
for(int i=0;i<m;i++){
scanf("%d%d%d",&G[i].u,&G[i].v,&G[i].w);
r[i]=i;
}
for(int i=0;i<n;i++){
p[i]=i;
}
sort(r,r+m,cmp);
for(int i=0;i<m;i++){
int e=r[i];
int x=find_(G[e].u);
int y=find_(G[e].v);
if(x!=y){
ans+=G[e].w;
y=p[x];
}
}
printf("%d",ans);
}
return 0;
}