| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 | 
							- func findRedundantDirectedConnection(edges [][]int) []int {
 
- 	n := len(edges)
 
- 	parent := make([]int, n+1)
 
- 	rank := make([]int, n+1)
 
- 	var e1, e2 []int
 
- 	for _, edge := range edges {
 
- 		beg, end := edge[0], edge[1]
 
- 		if parent[end] != 0 { // Has two parents, one of it is invalid.
 
- 			e1 = []int{parent[end], end}
 
- 			e2 = []int{beg, end}
 
- 			edge[0], edge[1] = 0, 0 // Delete the later edge.
 
- 		}
 
- 		parent[end] = beg
 
- 	}
 
- 	parent = make([]int, n+1) // Clear parent for UF.
 
- 	for _, edge := range edges {
 
- 		beg, end := edge[0], edge[1]
 
- 		if beg == 0 || end == 0 {
 
- 			continue
 
- 		}
 
- 		if parent[beg] == 0 {
 
- 			parent[beg] = beg
 
- 		}
 
- 		if parent[end] == 0 {
 
- 			parent[end] = end
 
- 		}
 
- 		i1, i2 := find(parent, beg), find(parent, end)
 
- 		if i1 == i2 { // Find loop, e1 or edge is the last of the loop.
 
- 			if len(e1) == 0 {
 
- 				return edge
 
- 			}
 
- 			return e1
 
- 		}
 
- 		if rank[i1] < rank[i2] {
 
- 			parent[i1] = i2
 
- 		} else {
 
- 			parent[i2] = i1
 
- 			if rank[i1] == rank[i2] {
 
- 				rank[i1]++
 
- 			}
 
- 		}
 
- 	}
 
- 	return e2 // Loop not found (after delete e2), so return e2.
 
- }
 
- func find(parent []int, id int) int {
 
- 	if parent[id] == id {
 
- 		return id
 
- 	}
 
- 	r := find(parent, parent[id])
 
- 	parent[id] = r
 
- 	return r
 
- }
 
 
  |