最小生生樹演算法 prim kruskal

2021-10-09 10:07:04 字數 2041 閱讀 9368

應用場景,求最小生生樹,prim o(n²),n指定點,kruskal(eloge),e指邊,即prim演算法從定點的角度取考慮,更適合邊稠密的網路,kruskal演算法從邊的角度取考慮,更適合邊稀疏的情況!

prim:

1.任意選取乙個起始點,找到最與這個起始點相連邊的權值最小的定點,得到集合點a

2.對a重複1的過程直到所有的點都被納入集合a

kruskal:

1、將v個頂點,l條邊的圖g中所有的邊按權值大小從小到大排序,這一步可以直接用庫函式qsort或者sort。

2、從權值小的邊開始依次選取,若選取的邊使生成樹t不形成迴路,則選之;若選取的邊使生成樹形成迴路,則將其捨棄;如此進行下去,直到選取v-1條邊為止。

在上述的方法中,最關鍵的地方在於判斷新加入的邊與生成樹是否構成迴路,判斷圖是否構成迴路有很多方法,這裡我們使用並查集來判斷圖是否構成迴路。

將頂點劃分到不同集合中,每個集合中的頂點表示乙個無迴路的連通分量。演算法開始時,將n個頂點劃分到n個集合中,每個集合乙個頂點,表示頂點之間互不相通。當選取一條邊時,若它的兩個頂點屬於不同的集合,則表明連通了兩個不同的連通分量,因每個連通分量沒有迴路,所以連通後仍然不會有迴路,因此保留這條邊;同時把兩個集合進行合併成為乙個集合。若選取的邊屬於同乙個集合,則捨棄此邊。

5513. 連線所有點的最小費用

給你乙個points 陣列,表示 2d 平面上的一些點,其中 points[i] = [xi, yi] 。

連線點 [xi, yi] 和點 [xj, yj] 的費用為它們之間的 曼哈頓距離 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的絕對值。

請你返回將所有點連線的最小總費用。只有任意兩點之間 有且僅有 一條簡單路徑時,才認為所有點都已連線。

1.最小生成樹裸題,prim優先佇列實現,kruskal排序+並查集實現

class solution:

def mincostconnectpoints(self, points: list[list[int]]) -> int:

from queue import priorityqueue

cal=lambda p1,p2:abs(p1[0]-p2[0])+abs(p1[1]-p2[1])

q=priorityqueue()

visited=set([i for i in range(len(points))])

q.put((0,0))

res=0

while visited:

cost,now=q.get()

if now not in visited:continue

visited.remove(now)

res+=cost

for i in visited:

q.put((cal(points[now],points[i]),i))

return res

class solution:

def mincostconnectpoints(self, points: list[list[int]]) -> int:

if len(points)<2:return 0

cost=

for i in range(len(points)-1):

for j in range(i+1,len(points)):

cost.sort(key=lambda x:x[0])

res=0

p=def find(x):

if p[x]!=x:

p[x]=find(p[x])

return p[x]

for c,i,j in cost:

if find(i)!=find(j):

p[find(i)]=find(j)

res+=c

return res

最小生成樹演算法

由帶權的連通圖生成的數的各邊加起來稱為生成樹的權,把權值最小的生成樹稱為最小生成樹 minimum spanning tree 簡稱為mst 構造最小生成樹的方法就是利用mst性質,一條一條地選擇可以加入的邊。下面介紹兩種用於構造最小生成樹的演算法,其中第一種演算法稱為prim演算法,第二種演算法稱...

最小生成樹演算法

乙個最簡單的最小生成樹 圖結構練習 最小生成樹 time limit 1000ms memory limit 65536k 有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。輸...

演算法 最小生成樹

前言 最小生成樹是在乙個給定的無向圖中求一棵樹,這棵樹包含無向圖中的所有頂點,且樹中的邊都來自無向圖中的邊,並且要滿足整棵樹的邊權之和最小。1 最小生成樹是樹,其邊數等於頂點數減1,且不會有環 2 對於給定的圖最小生成樹可以不唯一,但是邊權之和一定是唯一的。3 其根節點可以是這棵樹上的任何乙個節點,...