Kruskal 演算法 Python版

2021-07-28 20:51:56 字數 1648 閱讀 3551

好久沒寫了,有點遺忘記錄一下

kruskal 演算法

對所有的邊排序

依次選擇每一條邊,看是否能將邊加入到已經生成好的樹中

若是能,則加入

否則,繼續步驟2,直至新增到樹中的邊的數量為節點數-1 的時候

這裡用了並查集的思路:

設定乙個記錄每乙個節點的父親的陣列,用於判斷將邊加進已生成樹時是否會有環生成

記錄乙個每乙個節點有多少孩子節點的陣列,用於節點的合併

利用find()方法尋找最原始的父親

利用join()合併

# -*- coding:utf-8 -*-

import sys

class node:

def __init__(self,a,b,v):

self.a =a

self.b = b

self.v = v

def cmpnode(a,b):

if a.v < b.v:

return -1

elif a.v >b.v:

return 1

else:

return 0

def findf(i, father):

if father[i] ==i:

return i

return findf(father[i],father)

def join(a,b,father,son):

root1 = findf(a,father)

root2 = findf(b,father)

if root1 == root2:

return false

elif son[root1] >= son[root2]:

father[root2] = root1

son[root1] += son[root2]

else:

father[root1] = root2

son[root2] += son[root1]

return true

if __name__ == '__main__':

n,m = [int(i) for i in sys.stdin.readline().strip().split(' ')]

edges =

father =[0]*n

son = [0]*n

for i in range(n):

father[i] = i

son[i] = 1

for i in range(m):

p,q,k = [int(i) for i in sys.stdin.readline().strip().split(' ')]

edges.sort(cmp=cmpnode)

edgec = 0

maxnum = float('-inf')

for eachnode in edges:

if join(eachnode.a,eachnode.b,father,son):

edgec +=1

maxnum = max(maxnum,eachnode.v)

if edgec == n-1:

break

print maxnum

Prim演算法 Kruskal演算法

一 prim演算法 1 要求 1 生成一顆連通的樹 2 生成樹 包含全部頂點,v 1條邊,沒有迴路,並且新增一條邊會變成有迴路 3 權重和最小 2 過程模擬 最重要 貪心的思想,每一步都要選擇權值最小的,這棵樹所有跟頂點相連的邊中最小的。從根節點開始,讓樹慢慢的長大。過程 從v1開始 跟v1有聯絡的...

Prim演算法 Kruskal演算法

prim演算法 kruskal演算法 prim演算法和kruskal演算法,都是用來找出圖中最小生成樹的演算法,兩個演算法有些小差別。prim演算法 又稱普里姆演算法,以圖上的頂點為出發點,逐次選擇到最小生成樹頂點集距離最短的頂點為最小生成樹的頂點,並加入到該頂點集,直到包含所有的頂點。1.選擇一出...

Kruskal演算法 Prim演算法

最小生成樹是什麼?自a2392008643的部落格 此演算法可以稱為 加邊法 初始最小生成樹邊數為0,每迭代一次就選擇一條滿足條件的最小代價邊,加入到最小生成樹的邊集合裡。把圖中的所有邊按代價從小到大排序 把圖中的n個頂點看成獨立的n棵樹組成的森林 按權值從小到 擇邊,所選的邊連線的兩個頂點ui,v...