最小生成树MST-Kruskal算法

RT,题目链接http://zju.acmclub.com/index.php?app=problem_title&id=1&problem_id=2336

需要注意的问题有:

1.可以使用Kruskal算法,在判断回路时使用并查集结构;

2.并查集使用树的双亲指针数组作为存储结构,大小为树中点的数目;

初始化时:初始每一个点为一个单独的联通分量,S[i]=-1 for 1<=i<=|V|;

Find(S,x):返回单元素x所在的子集合名字(用树根来代表),这里如果两个点所返回的子集合名字相同,说明这两个点同属于一个连通分量;这种情况也说明,如果把当前边再加入这个连通分量中,就会产生回路;

Union(S,root1,root2):把以x为根的子集合与以y为根的子集合合并到一起;即对应把两个连通分量合并为一个,root1和root2可以通过Find函数找到根;

3.需要额外判断给定的数据是否能使图连通,方法是执行Kruskal算法后,数一数S[]数组中-1的个数,它的个数cnt即代表了算法结束后连通分量的个数,如果为1,说明有一个MST;否则若图不连通,树也必定不连通,故cnt一定大于1

4.边集用结构体数组来存,可以开的大一点,我刚开始就是开小了返回段错误;

5.排序可以用高效的库函数qsort,自己写一个比较函数MyCmp实现结构体数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值