1. 程式人生 > 實用技巧 >今天是leetcode685 冗餘連線

今天是leetcode685 冗餘連線

今天是leetcode685 冗餘連線

  • 這題容易想到的是有幾種情況能找到多餘的邊
  1. 有兩條邊同時指向某個點(衝突)

  1. 根節點被某條邊指向(成環)

用如下程式碼記錄衝突和環路

if(p[to] != to) {//若該邊指向的點已有父點,則產生衝突
                con = i;//記錄衝突邊
            }
            else {//若該邊不是產生衝突的邊
                p[to] = from;
                if(find(to) == find(from)) {
                    cur = i;//若該邊連線的兩點經過查詢屬於同一連通集,則產生環路。
                }else {
                    union(from, to); 
                }
                
            }

那怎麼根據上述兩種情況找到滿足條件的多餘邊呢?

  1. 針對第一種情況,答案肯定是在這兩條邊中的一個,那麼是哪一個呢?

這裡又涉及兩種情況,圖中存在環和不存在環

  • 若圖中存在環,那麼答案一定是兩條邊中在環上的那一個。然而怎麼找到在環上的那一個呢?

導致衝突的那一條邊不會被判定成成環,因此是另一條邊。

(即使真的有一種情況是衝突和成環是同一邊,那也會被判定為無環,而這種情況下就會將這條邊作為答案)

  • 若圖中無環,那就選擇這兩條邊中後出現的那個,也就是記錄在案的產生衝突的邊。

  1. 針對第二種情況,圖中肯定有環,這時如果圖中有衝突,則按前述方法,如果圖中無衝突,則選擇成環的最後一條邊,即產生環路的邊。