今天是leetcode685 冗餘連線
阿新 • • 發佈:2020-09-17
今天是leetcode685 冗餘連線
- 這題容易想到的是有幾種情況能找到多餘的邊
- 有兩條邊同時指向某個點(衝突)
- 根節點被某條邊指向(成環)
用如下程式碼記錄衝突和環路
if(p[to] != to) {//若該邊指向的點已有父點,則產生衝突 con = i;//記錄衝突邊 } else {//若該邊不是產生衝突的邊 p[to] = from; if(find(to) == find(from)) { cur = i;//若該邊連線的兩點經過查詢屬於同一連通集,則產生環路。 }else { union(from, to); } }
那怎麼根據上述兩種情況找到滿足條件的多餘邊呢?
- 針對第一種情況,答案肯定是在這兩條邊中的一個,那麼是哪一個呢?
這裡又涉及兩種情況,圖中存在環和不存在環
- 若圖中存在環,那麼答案一定是兩條邊中在環上的那一個。然而怎麼找到在環上的那一個呢?
導致衝突的那一條邊不會被判定成成環,因此是另一條邊。
(即使真的有一種情況是衝突和成環是同一邊,那也會被判定為無環,而這種情況下就會將這條邊作為答案)
- 若圖中無環,那就選擇這兩條邊中後出現的那個,也就是記錄在案的產生衝突的邊。
- 針對第二種情況,圖中肯定有環,這時如果圖中有衝突,則按前述方法,如果圖中無衝突,則選擇成環的最後一條邊,即產生環路的邊。