1. 程式人生 > 其它 >684 冗餘連線

684 冗餘連線

技術標籤:LeetCode

題目描述:
在本問題中, 樹指的是一個連通且無環的無向圖。
輸入一個圖,該圖由一個有著N個節點 (節點值不重複1, 2, …, N) 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到N中間,這條附加的邊不屬於樹中已存在的邊。
結果圖是一個以邊組成的二維陣列。每一個邊的元素是一對[u, v] ,滿足 u < v,表示連線頂點u 和v的無向圖的邊。
返回一條可以刪去的邊,使得結果圖是一個有著N個節點的樹。如果有多個答案,則返回二維陣列中最後出現的邊。答案邊 [u, v] 應滿足相同的格式 u < v。

示例 1:
輸入: [[1,2], [1,3], [2,3]]

輸出: [2,3]
解釋: 給定的無向圖為:
在這裡插入圖片描述
示例 2:

輸入: [[1,2], [2,3], [3,4], [1,4], [1,5]]
輸出: [1,4]
解釋: 給定的無向圖為:
在這裡插入圖片描述
注意:
輸入的二維陣列大小在 3 到 1000。
二維陣列中的整數在1到N之間,其中N是輸入陣列的大小。

方法1:
主要思路:解題彙總連結
(1)並查集;
(2)先將各個結點的父節點初始化自己;
(3)然後將陣列中的邊逐個的加入到並查集中,加入時候,先分別對邊的兩個端點找其父節點,若兩個結點的父節點相同,說明該邊造成了環的存在,此時可以直接返回該邊;
(4)若沒有存在,則將前一個端點的父節點的父節點修改為後面的結點父節點;

(5)在找父節點時候,為了減少深度,同時進行了路徑壓縮;

class Solution {
public:
    int find_father(vector<int>&father,int n){
        int n_tmp=n;
        while(n!=father[n]){//找給定結點的最終父節點
            n=father[n];
        }
        while(n_tmp!=father[n_tmp]){//再次遍歷該結點的向上找父親的路徑,同時在該次遍歷的過程中,將各個結點的父節點統一為最終的父節點
            int
pre=n_tmp; n_tmp=father[n_tmp];//遍歷路徑 father[pre]=n;//修改之前結點的父節點 } return n; } vector<int> findRedundantConnection(vector<vector<int>>& edges) { vector<int> father(edges.size()+1); for(int i=1;i<=edges.size();++i){//初始化各個點的父節點 father[i]=i; } for(vector<int>&e:edges){//逐個加入邊 //找出各個邊的端點的父節點 int f1=find_father(father,e[0]); int f2=find_father(father,e[1]); if(f1==f2){//是否存在環 return e; } else{ father[f1]=f2;//合併 } } return{}; } };