冗餘連線I II

2021-10-22 06:04:42 字數 1324 閱讀 4570

使用並查集解決leetcode 685與686題的無向圖冗餘連線、有向圖冗餘連線問題

無向圖冗餘連線

並查集解法:遍歷所有edges, 將邊的兩端節點合併到乙個集合中;如果兩個節點都已經在集合中導致合併失敗, 則說明找到環路,輸出當前邊;

class

solution

intmerge

(int a,

int b)};

vector<

int>

findredundantconnection

(vectorint>>

& edges)

;return ans;}}

return vector<

int>()

;}};

有向圖冗餘連線

題目中的圖有兩種約束, 1.存在乙個沒有父節點的根節點 2.除了根節點每個節點只有乙個父節點

此圖僅存在兩種對立情況: 1.所有節點都只有乙個父節點,意味這多餘的邊指向根節點 2. 存在乙個節點有2個父節點

雜湊表+並查集解法步驟:

1.遍歷edges,先用雜湊表的性質, 判斷有沒有某個節點存在兩個父節點, 如果有則用flag標記該節點下標,否則設為-1;

2.再次遍歷edges構建並查集, 若沒有乙個節點存在2個父節點,則按無向圖方法輸出多餘邊;若不滿足約束2,跳過指向被標記的節點的邊,同時儲存該邊起點;

3.掃瞄儲存的2個起點, 其中一條邊的兩節點必然已經存在於並查集中,將構成環路,判斷不能合併成功,則此邊就是多餘邊

class

solution

intmerge

(int a,

int b)};

vector<

int>

findredundantdirectedconnection

(vectorint>>

& edges)

else

}/****合併節點*****/

for(

int i =

0; i < edges.

size()

; i++)if

(!uf.

merge

(u, v)

&& flag ==-1

);return ans;}}

/****對多餘父節點情況單獨處理*****/

for(

int i =

0; i <

2; i++);

return ans;}}

return vector<

int>()

;}};

684 冗餘連線

在本問題中,樹指的是乙個連通且無環的無向圖。輸入乙個圖,該圖由乙個有著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的無向...

684 冗餘連線

684.冗餘連線 在本問題中,樹指的是乙個連通且無環的無向圖。輸入乙個圖,該圖由乙個有著n個節點 節點值不重複1,2,n 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到n中間,這條附加的邊不屬於樹中已存在的邊。結果圖是乙個以邊組成的二維陣列。每乙個邊的元素是一對 u,v 滿足 u v,表示連線...