演算法強化 最小生成樹

2021-10-04 01:52:27 字數 3514 閱讀 7939

思想:用集合中的乙個元素代表集合

操作:合併(union):把兩個不想交的集合合併為乙個集合

查詢(find):查詢兩個元素是否在同乙個集合中

在本問題中, 樹指的是乙個連通且無環的無向圖。

輸入乙個圖,該圖由乙個有著n個節點 (節點值不重複1, 2, …, n) 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到n中間,這條附加的邊不屬於樹中已存在的邊。

結果圖是乙個以邊組成的二維陣列。每乙個邊的元素是一對[u, v] ,滿足 u < v,表示連線頂點u 和v的無向圖的邊。

返回一條可以刪去的邊,使得結果圖是乙個有著n個節點的樹。如果有多個答案,則返回二維陣列中最後出現的邊。答案邊 [u, v] 應滿足相同的格式 u < v。

示例 1:

輸入: [[1,2], [1,3], [2,3]]

輸出: [2,3]

解釋: 給定的無向圖為:1/

2 - 3

示例 2:

輸入: [[1,2], [2,3], [3,4], [1,4], [1,5]]

輸出: [1,4]

解釋: 給定的無向圖為:

5 - 1 - 2

| |4 - 3

class

solution

:def

findredundantconnection

(self,edges)

:# 用並查集,進來一對邊,就查詢兩個節點的根節點,如果是一樣的,那就不能要這對邊,否則就增加這對邊

pre =[0

]*1001

# 初始化所有的節點為單獨的根節點

for edge in edges:

x = self.find(edge[0]

,pre)

y = self.find(edge[1]

,pre)

if x != y:

pre[y]

= x else

:return edge

deffind

(self,node,pre)

:while pre[node]!=0

: node = pre[node]

return node

所謂最小生成樹,就是乙個圖的極小連通子圖,它包含原圖的所有頂點,並且所有邊的權值之和盡可能小

注意1.包含所有節點

2.所有邊權值和最小

3.圖的極小連通子圖不需要迴路,而是乙個樹形結構,所以人們才把它叫做最小生成樹,圖的最小生成樹也不是唯一的,同乙個圖有可能對應多個最小生成樹

1.新建圖g,g中擁有原圖中相同的結點,但是沒有邊

2.將原圖中所有邊按照權值從小到大排序

3.從權值最小的邊開始,如果這條邊連線的兩個結點不在乙個連通分量中(也就是不形成環),則新增這條邊到圖g中

4.重複3,直到圖g中所有的節點都在同乙個連通分量中。

想象一下你是個城市基建規劃者,地圖上有 n 座城市,它們按以 1 到 n 的次序編號。

給你一些可連線的選項 conections,其中每個選項 conections[i] = [city1, city2, cost] 表示將城市 city1 和城市 city2 連線所要的成本。(連線是雙向的,也就是說城市 city1 和城市 city2 相連也同樣意味著城市 city2 和城市 city1 相連)。

返回使得每對城市間都存在將它們連線在一起的連通路徑(可能長度為 1 的)最小成本。該最小成本應該是所用全部連線代價的綜合。如果根據已知條件無法完成該項任務,則請你返回 -1。

class

solution

:def

minimumcost

(self,n,connections):if

len(connections)

return-1

# 對節點進行排序操作

connections.sort(key =

lambda a:a[2]

)# 最小生成樹的儲存結構

parent =

[i for i in

range

(n)]

deffind

(x):

if x != parent[x]

: parent[x]

= find(parent[x]

)return parent[x]

res,e,k =0,

0,0while e# 從小到大找邊

u,v,w = connections[k]

k +=

1# 找根節點

x,y = find(u-1)

,find(v-1)

# 如果不想同 兩個頂點在兩個不同的連通分量

if x!=y:

e +=

1 res += w

parent[x]

= y return res

這個演算法是以圖的頂點為基礎

從乙個初始頂點開始,尋找觸達其他頂點權值最小的邊,並把改頂點加入到已經觸達頂點的集合中。

當全部頂點都加入到集合中,演算法的工作就完成了,prim演算法的本質,是基於貪心演算法。

v表示節點集合,e表示邊集合

v1表示最小生成樹所包含的節點,v2表示未包含節點

初始時v1為空,v2= v

當v2為空,v1= v時演算法結束

1.隨機選擇乙個結點v加入到v1,並從v2中刪除v

2.選擇邊權最小的,其中u∈v

1,v∈

v2

u \in v1,v \in v2

u∈v1,v

∈v2,將v從v2移動到v1

3.重複2步驟直到v2為空

def

minimumcost

(self,n,connections):if

len(connections)

return-1

graph =

for u,v,w in connections:

graph[

(u,v)

]= w

now =[1

] res =

0for i in

range

(n-1):

minnode =

0 mindis =

float

('inf'

)for j in

range

(n+1):

for x in now:

if j not

in now and

(x,j)

in graph.keys():

if graph[

(x,j)

]mindis = graph[

(x,j)

] minnode = j

res += mindis

return res

最小生成樹演算法

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

最小生成樹演算法

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

演算法 最小生成樹

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