685.redundant-connection-ii.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. func findRedundantDirectedConnection(edges [][]int) []int {
  2. n := len(edges)
  3. parent := make([]int, n+1)
  4. rank := make([]int, n+1)
  5. var e1, e2 []int
  6. for _, edge := range edges {
  7. beg, end := edge[0], edge[1]
  8. if parent[end] != 0 { // Has two parents, one of it is invalid.
  9. e1 = []int{parent[end], end}
  10. e2 = []int{beg, end}
  11. edge[0], edge[1] = 0, 0 // Delete the later edge.
  12. }
  13. parent[end] = beg
  14. }
  15. parent = make([]int, n+1) // Clear parent for UF.
  16. for _, edge := range edges {
  17. beg, end := edge[0], edge[1]
  18. if beg == 0 || end == 0 {
  19. continue
  20. }
  21. if parent[beg] == 0 {
  22. parent[beg] = beg
  23. }
  24. if parent[end] == 0 {
  25. parent[end] = end
  26. }
  27. i1, i2 := find(parent, beg), find(parent, end)
  28. if i1 == i2 { // Find loop, e1 or edge is the last of the loop.
  29. if len(e1) == 0 {
  30. return edge
  31. }
  32. return e1
  33. }
  34. if rank[i1] < rank[i2] {
  35. parent[i1] = i2
  36. } else {
  37. parent[i2] = i1
  38. if rank[i1] == rank[i2] {
  39. rank[i1]++
  40. }
  41. }
  42. }
  43. return e2 // Loop not found (after delete e2), so return e2.
  44. }
  45. func find(parent []int, id int) int {
  46. if parent[id] == id {
  47. return id
  48. }
  49. r := find(parent, parent[id])
  50. parent[id] = r
  51. return r
  52. }