weixin_45773632 2020-04-16 16:26 采纳率: 33.3%
浏览 107

并查集和最小生成数,求帮助

#include
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;

}

6 9
2 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2
这里是测试数据
正确结果应该是19
这个程序输出结果是16

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-09 16:20
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 现在新建了一个f1的就不行了包括所有新建的项目都无法生成,路径命名都没问题,keil和cubemx重装过还是不行,如何解决?(标签-java|关键词-固件)
  • ¥15 web前端开发怎么实现像图片这样的页面啊?
  • ¥15 ubuntu 20.04 网卡启用后,只有ipv6 没有 ipv4 无法上网
  • ¥15 QT任务管理器无法正确获取展开,有悬赏15元速求,如何解决?(相关搜索:标识符|结构体)
  • ¥15 使用delphi 10.3+intraweb 生成的页面怎么实现自动滚屏
  • ¥20 思科:Router c3600 MN-4E插槽
  • ¥15 16进制修改视频的元数据
  • ¥15 HTML中css的位置信息居然会导致元素大小发生变化
  • ¥15 岛津txt格式文件转nirs格式
  • ¥15 有偿指导软件编程与八股