File tree 1 file changed +60
-0
lines changed
1 file changed +60
-0
lines changed Original file line number Diff line number Diff line change
1
+ use std:: cmp:: Ordering ;
2
+
3
+ struct UnionFind {
4
+ parent : Vec < usize > ,
5
+ rank : Vec < i32 > ,
6
+ }
7
+
8
+ impl UnionFind {
9
+ fn new ( n : usize ) -> Self {
10
+ UnionFind {
11
+ parent : ( 0 ..( n + 1 ) ) . collect ( ) ,
12
+ rank : vec ! [ 1 ; n + 1 ] ,
13
+ }
14
+ }
15
+
16
+ fn find ( & mut self , n : usize ) -> usize {
17
+ let mut p = self . parent [ n] ;
18
+
19
+ while p != self . parent [ p] {
20
+ self . parent [ p] = self . parent [ self . parent [ p] ] ;
21
+ p = self . parent [ p] ;
22
+ }
23
+
24
+ p
25
+ }
26
+
27
+ fn union ( & mut self , n1 : usize , n2 : usize ) -> bool {
28
+ let p1 = self . find ( n1) ;
29
+ let p2 = self . find ( n2) ;
30
+
31
+ if p1 == p2 {
32
+ return false ;
33
+ }
34
+ match self . rank [ p1] . cmp ( & self . rank [ p2] ) {
35
+ Ordering :: Greater => {
36
+ self . parent [ p2] = p1;
37
+ self . rank [ p1] += self . rank [ p2] ;
38
+ }
39
+ _ => {
40
+ self . parent [ p1] = p2;
41
+ self . rank [ p2] = self . rank [ p1] ;
42
+ }
43
+ }
44
+ true
45
+ }
46
+ }
47
+
48
+ impl Solution {
49
+ pub fn find_redundant_connection ( edges : Vec < Vec < i32 > > ) -> Vec < i32 > {
50
+ let mut union_find = UnionFind :: new ( edges. len ( ) + 1 ) ;
51
+
52
+ for edge in edges {
53
+ let ( n1, n2) = ( edge[ 0 ] as usize , edge[ 1 ] as usize ) ;
54
+ if !union_find. union ( n1, n2) {
55
+ return vec ! [ n1 as i32 , n2 as i32 ] ;
56
+ }
57
+ }
58
+ unreachable ! ( )
59
+ }
60
+ }
You can’t perform that action at this time.
0 commit comments