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
- }
|