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

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

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

高级数据结构实验(Kruskal算法)_第1张图片
代码构思:
定义字典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()

运行结果:
高级数据结构实验(Kruskal算法)_第2张图片

你可能感兴趣的:(1024程序员节)