知識點:並查集
題目
在本問題中,有根樹指滿足以下條件的有向圖。該樹只有乙個根節點,所有其他節點都是該根節點的後繼。每乙個節點只有乙個父節點,除了根節點沒有父節點。
輸入乙個有向圖,該圖由乙個有著n個節點 (節點值不重複1, 2, …, n) 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到n中間,這條附加的邊不屬於樹中已存在的邊。
結果圖是乙個以邊組成的二維陣列。 每乙個邊 的元素是一對 [u, v],用以表示有向圖中連線頂點 u 和頂點 v 的邊,其中 u 是 v 的乙個父節點。
返回一條能刪除的邊,使得剩下的圖是有n個節點的有根樹。若有多個答案,返回最後出現在給定二維陣列的答案。
示例1
輸入:
[[1,2], [1,3], [2,3]]
輸出:
[2,3]
解釋: 給定的有向圖如下:
1
/ \v v2--
>
3
示例2
輸入:
[[1,2], [2,3], [3,4], [4,1], [1,5]]
輸出:
[4,1]
解釋: 給定的有向圖如下:
5
<-1
->2^
|| v
4<
-3
注意:
二維陣列大小的在3到1000範圍內。
二維陣列中的每個整數在1到n之間,其中 n 是二維陣列的大小。
解釋:
[[2
,1],
[3,1
],[4
,2],
[1,4
]]2-
>
1<-3
^/|<
4
所謂有根樹,也就這棵樹的根節點沒有父親節點,其他節點都有且只有乙個父親節點
當加入這條多餘的邊會後導致的情況
1.附加的邊指向根節點,這樣就出現了環路
2.附加的邊指向非根節點,可能有環路如上圖所示 也可沒有如例1
使用陣列parent記錄每個節點的父節點,一開始parent[i]=i,並查集初始化
開始遍歷edges,訪問[u,v]
如果parent[v] != v 說明v有兩個父親節點,這條邊是導致衝突的邊
否則parent[v] = u,通過並查集查詢u和v的祖先節點 若相同 這條邊是導致環路 否則在並查集中合併
遍歷完成後
沒有衝突的邊,也就是只有導致環路的邊,直接取出就可,也是最後一條被找到的
有衝突的
導致環路了,如上圖所示 2->1 又是環路又是衝突,有兩條邊指向1,一條邊為[u=3,v=1],另一條邊為 [parent[1]=2,1],[3,1]已經被標記為衝突的邊了,不可能同時是導致環路的邊,所以是[2,1]
沒有導致環路,返回衝突的邊
**
#include
#include
#include
using
namespace std;
struct unionfind
intfind
(int x)
void
merge
(int x,
int y)};
class
solution
else}if
(conflict_index<0)
;}else
;else
return vector<
int>;}
}};int
main()
; edges[1]
=;edges[2]
=;edges[3]
=;edges[4]
=;solution s;
vector<
int> ans = s.
findredundantdirectedconnection
(edges)
; cout<<<
" "
<
}
今天也是愛zz的一天哦!
Leetcode刷題筆記
1.兩數之和給定乙個整數陣列nums 和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。ps 你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。思路 用target減去nums中的每乙個數,並設立乙個字典來記錄對應的下標 class...
LeetCode刷題筆記
實現strstr 給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。示例 1 輸入 haystack hello needle ll 輸出 2 示例 2 輸入 haystack aaaa...
LeetCode刷題筆記
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...