思想:用集合中的乙個元素代表集合
操作:合併(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 其根節點可以是這棵樹上的任何乙個節點,...