高级数据结构实验(Kruskal算法)

高级数据结构实验(Kruskal算法)

实验内容:
采用Kruskal算法生成最小生成树,并采用并查集的合并优化和查询优化。
测试数据:

在这里插入图片描述
代码构思:
定义字典top记录各点所在集合
定义字典tree记录边与边的权值
定义函数tree_min(top,tree,dic1={})选取最小生成树,在此函数里,通过python的min函数选取tree中value最小的key,将此键值对写入dic1中,然后在tree删除此键值对(目的是在后续递归找最小权值时可以找到次小的),用并查集判断是否成环(如果一条边上的两个点已经在同一集合里将会成环),如果成环在dic里删除此边,未成环则将第二个点及与第二个点在同一集合里的点并入第一个点所在的集合里。递归此函数(因为字典无法排序所以选择用递归完成遍历过程)直至dic1里有len(top)-1条边(n个点相连的最小边数为n-1)。因为python字典的特性,递归的所有函数里的dic1是同一个,不需作归并处理,递归完成后直接输出dic1即为最小生成树。
定义tree_and()函数计算树的权值和

源码:

def tree_min(top, tree, dic1={}):
    if not len(dic1) == len(top) - 1:
        min1 = min(tree, key=lambda x: tree[x])
        dic1[min1] = tree[min1]
        del tree[min1]
        if not (top[min1[0]] == top[min1[1]]):
            for i in top:
                if top[i] == top[min1[1]]:
                    top[i] = top[min1[0]]
        else:
            del dic1[min1]
        tree_min(top, tree, dic1)
    return dic1

def tree_and(tree):
    sum = 0
    for i in tree:
        sum += tree[i]
    return sum

def main():
    top = {1: 1, 2: 2, 3: 3, 4: 4, 5: 5}
    tree = {(1, 2): 2, (1, 3): 5, (1, 4): 2, (2, 3): 3, (2, 5): 4, (3, 4): 1, (3, 5): 6}
    tree_min1 = tree_min(top, tree)
    min_and1 = tree_and(tree_min1)
    print('此树的最小生成树为:%s' % tree_min1)
    print('最小生成树权值和为:%d' % min_and1)

if __name__ == '__main__':
    main()

运行结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值