|
@@ -0,0 +1,49 @@
|
|
|
+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{}
|
|
|
+}
|