初始化
void UFset( ) //初始化
{
for(int i=1;i<=n;i++){
parent[i]=i;
// printf("777777%d\n",parent[i]);
}
}
建边
for(int i=2;i<=n;i++){
edge[++cnt].from=road[i-1].id;
//printf("%lld\n",edge[cnt].from);
edge[cnt].to=road[i].id;
edge[cnt].cost=road[i].x-road[i-1].x;
查找是否加入集合
int find(int x)
{
if(parent[x]==x) { //代表x无上级了,即队长
// printf("eeee%d\n",x);
return x;}
return parent[x]=find(parent[x]);
}
主函数
struct side{
int s,t, len;
}s[55555];
int pre[1100];//并查集用的前驱数组
int n,m;
bool cmp(side a,side b)
{
return a.len<b.len;
}
int find(int x)
{
if(pre[x]==x) //代表x无上级了,即队长
return x;
return pre[x]=find(pre[x]);
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
For(int i=0;i<=n;i++)pre[i]=i;
for(int i=0;i<m;i++)
{
int s1,t,w;
scanf("%d%d%d",&s1,&t,&w);
s[i].s=s1;
s[i].t=t;
s[i].len=w;
}
sort(s,s+m,cmp); //排序,然后从小边开始选
int sum=0;
int count=0;
for(int i=0;i<m && count<n-1;i++)
{
//记下两端点的队长
int fx=find(s[i].s);
int fy=find(s[i].t);
if(fx!=fy)//不在一个集合
{
pre[fx]=fy;
sum+=s[i].len;
count++;
}
}
printf("%d\n",sum);
}
return 0;
}