思路:記錄1到n的每個數的根,因為如果有環,導致環相連的[u, v]一定有相同的root,
我們可以理解為是乙個節點的兩個分支,通過[u,v]被連起來了,既然他們是乙個節點的兩個分支,那麼他們一定有相同的root,所以直接移除[u,v]就好啦。
class solution:def findredundantconnection(self, edges: list[list[int]]) -> list[int]:
# 並查集
root = [i for i in range(len(edges)+1)]
# 找根節點
def find(i):
# 根節點就是自身
case2.1雖然沒有構成環,但是node 3有兩個parent,分別是1, 2,因此也要刪除一條邊
構成環的,就要將構成環的邊刪除
case2.2 為什麼不是刪除1,4這條邊,因為1節點有兩個父節點,因此要刪除兩個父節點的那條邊,所以刪除1,2這條邊
上一道題解說過,無向圖能構成一棵樹的條件是沒有環,那麼有向圖的條件是什麼呢?
首先還是得沒有環,其次因為是邊是有向的,所以乙個結點只能有乙個父結點(也就是入度為
)。那麼這題解法就有了。
判斷能否構成一棵樹的話還是用並查集,唯一區別就是不需要用按秩合併的優化了,而且給定有向邊
,只能把
接在下面。
class solution:參考:def __init__(self):
self.n = 0
self.f =
def findredundantdirectedconnection(self, edges):
self.n = len(edges)
degree = [0] * (self.n + 1)
for u, v in edges:
degree[v] += 1
for u, v in edges[::-1]:
if degree[v] == 2 and len(self.wrongedge(edges, [u, v])) == 0:
return [u, v]
return self.wrongedge(edges, )
def wrongedge(self, edges, ex):
self.f = [i for i in range(self.n + 1)]
for u, v in edges:
if [u, v] == ex:
continue
if self.same(u, v):
return [u, v]
self.join(u, v)
return
def find(self, u):
if u == self.f[u]:
return u
self.f[u] = self.find(self.f[u])
return self.f[u]
def join(self, u, v):
u, v = self.find(u), self.find(v)
if u == v:
return
self.f[v] = u
def same(self, u, v):
u, v = self.find(u), self.find(v)
return u == v
(並查集)684 冗餘連線
在本問題中,樹指的是乙個連通且無環的無向圖。輸入乙個圖,該圖由乙個有著n個節點 節點值不重複1,2,n 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到n中間,這條附加的邊不屬於樹中已存在的邊。結果圖是乙個以邊組成的二維陣列。每乙個邊的元素是一對 u,v 滿足 u v,表示連線頂點u 和v的無向...
並查集之冗餘連線
在本問題中,樹指的是乙個連通且無環的無向圖。輸入乙個圖,該圖由乙個有著n個節點 節點值不重複1,2,n 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到n中間,這條附加的邊不屬於樹中已存在的邊。結果圖是乙個以邊組成的二維陣列。每乙個邊的元素是一對 u,v 滿足 u v,表示連線頂點u 和v的無向...
684 冗餘連線 並查集
在本問題中,樹指的是乙個連通且無環的無向圖。輸入乙個圖,該圖由乙個有著n個節點 節點值不重複1,2,n 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到n中間,這條附加的邊不屬於樹中已存在的邊。結果圖是乙個以邊組成的二維陣列。每乙個邊的元素是一對 u,v 滿足 u v,表示連線頂點u 和v的無向...