使用並查集解決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,表示連線...