zoukankan      html  css  js  c++  java
  • 树算法笔记(二):Kruskal最小生成树

    用到并查集判断连通性,效率很高,最终时间复杂度为O(nlogn)

    思路:

    1,先将边的权值从低到高排序

    2,如果两个顶点已经连接便跳过,如果未连接就将其连接

    3,当边数为顶点数-1时,最小生成树完成

    class UnionFind(object):
        def __init__(self,n):
            self.uf=[i for i in range(n+1)]
            self.rank=[0 for i in range(n+1)] #树高度
            self.sets_count=n #集合个数
        
        def find_root(self,p):
            if self.uf[p]==p:
                return p
            else:
                self.uf[p]=self.find_root(self.uf[p])
                return self.uf[p]
        
        def unite(self,a,b):
            a=self.find_root(a)
            b=self.find_root(b)
            if a==b:
                return
            if self.rank[a]<self.rank[b]: #树低的一方合并到树高的一方
                self.uf[a]=b
            else:
                self.uf[b]=a #规定默认情况右边合并到左边
                if self.rank[a]==self.rank[b]:
                    self.rank[a]+=1
            
        def is_connect(self,a,b):
            return self.find_root(a)==self.find_root(b)
    
    data='''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'''
    
    lines=data.split("
    ")
    for i,line in enumerate(lines):
        lines[i]=list(map(int,line.split(" ")))
    lines.sort(key=lambda line:line[2])
    
    u=UnionFind(6)
    
    #边数
    count=0
    mins=0
    for minx in lines:
        if u.is_connect(minx[0],minx[1]):
            continue
        else:
            u.unite(minx[0],minx[1])
            count+=1
            mins+=minx[2]
            if count>=5:
                break
    
    print(mins)
    可以直接留言交流问题或想法,每天都会看
  • 相关阅读:
    测试脚本
    浅谈优化SQLServer数据库服务器内存配置的策略
    真正的取真实IP地址及利弊Asp.net
    ASP.NET一些常用正则表达式
    (CHMSoftware)工具集锦
    仿真方面的文章
    TPlan测试过程管理工具技术摘要
    Linux 2.6内核的精彩世界(多媒体)
    Ajax技术实践之完成Ajax自动完成功能
    硬件测试
  • 原文地址:https://www.cnblogs.com/shitianfang/p/12433999.html
Copyright © 2011-2022 走看看