首页 新闻 会员 周边

并查集解决最小生成树问题

0
悬赏园豆:50 [待解决问题]

include <stdio.h>
typedef struct edge
{
int u;
int v;
int w;
}edge;
edge e[10];
int n,m;
int f[7] = {0},sum = 0,count = 0;

void quicksort(int left,int right)
{
int i,j;
edge t;
if(left>right)
return;
i = left;
j = right;
while(i != j)
{
//从右边开始找比基准值小的元素
while(e[j].w>=e[left].w&&i<j)
j--;
//从左边找比基准值大的元素
while(e[i].w<=e[left].w&&i<j)
i++;
if(i < j)//交换
{
t = e[i];
e[i] = e[j];
e[j] = t;
}
}
//将基准数归位 (放到最后应该在的位置),将left的和i互换m;
t = e[left];
e[left] = e[i];
e[i] = t;
quicksort(left,i-1);
quicksort(i+1,right);
return;
}
int getf(int v)
{
if(f[v] == v)
return v;
else
{
f[v] = getf(f[v]);
return f[v];
}
}

int merge(int u,int v)
{
int t1,t2;
t1 = getf(u);
t2 = getf(v);
if(t1 != t2);//判断两个节点是否在同一个集合中 ,即是否为同一个祖先
{
f[t2] = t1;
return 1;
//靠左原则,左边的变成右边的boss
}
return 0;
}

int main ()
{
int i,j;
scanf("%d %d",&n,&m);
for(i=1;i <= m;i++)
scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w);
quicksort(1,m);
for(i = 1;i <= n;i++)
f[i]= i;
for(i = 1;i <= m;i++)
{
if(merge(e[i].u,e[i].v) > 0)
{
count++;
sum += e[i].w;
printf("%d %d\n",e[i].u,e[i].v);

	for(j = 1;j <= 6;j++)
		printf("%d ",f[j]);
	printf("\n");
	 
}
if(count == n-1)
	break;

}
printf("%d",sum);
return 0;
}

1 2
1 3
4 6
5 6
2 3
4 5
3 4
2 4
3 5//排序结果

1 2
1 1 3 4 5 6
1 3
1 1 1 4 5 6
4 6
1 1 1 4 5 4
5 6
1 1 1 5 5 4
2 3//按程序应该不会执行这一步,会跳过
1 1 1 5 5 4
16//结果
这里是测试数据
正确结果应该是19
这个程序输出结果是16

木有呂朋友的主页 木有呂朋友 | 初学一级 | 园豆:99
提问于:2020-04-19 16:53
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册