並查集 冗餘連線

2022-06-07 09:57:09 字數 2333 閱讀 4382

思路:記錄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的無向...