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)
    可以直接留言交流问题或想法,每天都会看
  • 相关阅读:
    matlab关闭文件
    matlab字符串比较
    matlab画直线
    已解决:TeamViewer使用的设备数量上限
    ubuntu安装teamviewer,缺少依赖处理
    木心的话
    SQL 语句中 where 条件后 写上1=1 是什么意思
    NetCore获取当前请求URL的方法
    NetCore3.1 日志组件 Nlog的使用
    Mysql并发时经典常见的死锁原因及解决方法
  • 原文地址:https://www.cnblogs.com/shitianfang/p/12433999.html
Copyright © 2011-2022 走看看