在本問題中,有根樹指滿足以下條件的有向圖。該樹只有乙個根節點,所有其他節點都是該根節點的後繼。每乙個節點只有乙個父節點,除了根節點沒有父節點。
輸入乙個有向圖,該圖由乙個有著n個節點 (節點值不重複1, 2, ..., n) 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到n中間,這條附加的邊不屬於樹中已存在的邊。
結果圖是乙個以邊組成的二維陣列。 每乙個邊 的元素是一對 [u, v],用以表示有向圖中連線頂點 u 和頂點 v 的邊,其中 u 是 v 的乙個父節點。
返回一條能刪除的邊,使得剩下的圖是有n個節點的有根樹。若有多個答案,返回最後出現在給定二維陣列的答案。
示例 1:
輸入: [[1,2], [1,3], [2,3]]
輸出: [2,3]
解釋: 給定的有向圖如下:
1/ \
v v
2-->3
示例 2:
輸入: [[1,2], [2,3], [3,4], [4,1], [1,5]]
輸出: [4,1]
解釋: 給定的有向圖如下:
5 2
^ |
| v
4 注意:二維陣列大小的在3到1000範圍內。
二維陣列中的每個整數在1到n之間,其中 n 是二維陣列的大小。
官方題解:
//無衝突邊,有環路邊
if (conflict < 0)
;return redundant;
} //有衝突邊,判斷哪個導致環路
else
;return redundant;
} else
;return redundant;}}
}}class unionfind
}public void union(int index1, int index2)
public int find(int index)
return ancestor[index];}}
同思路,另一種解法
class solution
return false;
}private int find(int n)
public int findredundantdirectedconnection(int edges)
return u;
}/**
** @param edges
* @return
* 需要考慮有沒有環和重複的父節點
*/public int findredundantdirectedconnection(int edges)
else
;backedge=new int;
edge[1]=0;}}
//重置parent
for (int i = 0; i <= edges.length; i++)
//去掉後乙個衝突後,再次迴圈,判斷前乙個衝突是否導致了環路
for(inte:edges)
//判斷有沒有環,有環且該邊的父節點未被置為0,則返回backedge,否則返回e
if(find(e[0])==e[1])
parent[e[1]]=e[0];
}return pending;}}
並查集:
547:朋友圈
684:冗餘連線(無向圖)
685:冗餘連線(有向圖)
737:句子相似性2
990:等式方程可滿足性
1319:連通網路操作次數
952: 按公因數計算最大元件大小
leetcode685 冗餘連線 II 並查集
在本問題中,有根樹指滿足以下條件的有向圖。該樹只有乙個根節點,所有其他節點都是該根節點的後繼。每乙個節點只有乙個父節點,除了根節點沒有父節點。輸入乙個有向圖,該圖由乙個有著n個節點 節點值不重複1,2,n 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到n中間,這條附加的邊不屬於樹中已存在的邊。...
並查集 並查集
本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...
並查集 leetcode 程式設計題
先看先人的總結 置頂 並查集詳解 傻子都能看懂的並查集入門 parent 集合代表,rank集合層級,data 元素的數值 初始化 將所有元素的集合代表設定成自己,rank層級設定成0,查詢 查詢乙個元素的集合代表,原理是指標迴圈操作 合併集合 將兩個集合的集合代表設定成乙個。一般根據rank層級選...