12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- type unionFind struct {
- id []int
- sz []int
- }
- func newUF(k int) (uf unionFind) {
- uf.id = make([]int, k+1)
- uf.sz = make([]int, k+1)
- for i := range uf.id {
- uf.id[i] = i
- }
- return
- }
- func (uf unionFind) union(x, y int) bool {
- x, y = uf.find(x), uf.find(y)
- if x == y {
- return false
- }
- if uf.sz[x] < uf.sz[y] {
- uf.id[x] = y
- } else {
- uf.id[y] = x
- if uf.sz[x] == uf.sz[y] {
- uf.sz[x]++
- }
- }
- return true
- }
- func (uf unionFind) find(x int) int {
- if uf.id[x] == x {
- return x
- }
- i := uf.find(uf.id[x])
- uf.id[x] = i
- return i
- }
- func findRedundantConnection(edges [][]int) []int {
- n := len(edges)
- uf := newUF(n)
- for _, edge := range edges {
- if !uf.union(edge[0], edge[1]) {
- return edge
- }
- }
- return []int{}
- }
|