684.redundant-connection.go 736 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. type unionFind struct {
  2. id []int
  3. sz []int
  4. }
  5. func newUF(k int) (uf unionFind) {
  6. uf.id = make([]int, k+1)
  7. uf.sz = make([]int, k+1)
  8. for i := range uf.id {
  9. uf.id[i] = i
  10. }
  11. return
  12. }
  13. func (uf unionFind) union(x, y int) bool {
  14. x, y = uf.find(x), uf.find(y)
  15. if x == y {
  16. return false
  17. }
  18. if uf.sz[x] < uf.sz[y] {
  19. uf.id[x] = y
  20. } else {
  21. uf.id[y] = x
  22. if uf.sz[x] == uf.sz[y] {
  23. uf.sz[x]++
  24. }
  25. }
  26. return true
  27. }
  28. func (uf unionFind) find(x int) int {
  29. if uf.id[x] == x {
  30. return x
  31. }
  32. i := uf.find(uf.id[x])
  33. uf.id[x] = i
  34. return i
  35. }
  36. func findRedundantConnection(edges [][]int) []int {
  37. n := len(edges)
  38. uf := newUF(n)
  39. for _, edge := range edges {
  40. if !uf.union(edge[0], edge[1]) {
  41. return edge
  42. }
  43. }
  44. return []int{}
  45. }