Leetcode刷題筆記 685 冗餘連線 II

2021-10-09 13:17:28 字數 2330 閱讀 8756

知識點:並查集

題目

在本問題中,有根樹指滿足以下條件的有向圖。該樹只有乙個根節點,所有其他節點都是該根節點的後繼。每乙個節點只有乙個父節點,除了根節點沒有父節點。

輸入乙個有向圖,該圖由乙個有著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 輸出 ...