1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- package main
- import "fmt"
- type disjointSet struct {
- par []int
- rank []int
- }
- func newDisjointSet(n int) disjointSet {
- ds := disjointSet{make([]int, n), make([]int, n)}
- for i := range ds.par {
- ds.par[i] = i
- }
- return ds
- }
- func (ds disjointSet) find(i int) int {
- if ds.par[i] == i {
- return i
- }
- pa := ds.find(ds.par[i])
- ds.par[i] = pa
- return pa
- }
- func (ds disjointSet) isConnected(i, j int) bool {
- return ds.find(i) == ds.find(j)
- }
- func (ds disjointSet) union(i, j int) bool {
- i, j = ds.find(i), ds.find(j)
- if i == j {
- return false
- }
- if ds.rank[i] < ds.rank[j] {
- ds.par[i] = j
- } else {
- if ds.rank[i] == ds.rank[j] {
- ds.rank[i]++
- }
- ds.par[j] = i
- }
- return true
- }
- func main() {
- var n int
- fmt.Print("Number of connections: ")
- fmt.Scan(&n)
- ds := newDisjointSet(n)
- for i := 1; i <= n; i++ {
- var x, y int
- fmt.Printf("No.%d connection: ", i)
- fmt.Scan(&x, &y)
- ds.union(x, y)
- }
- fmt.Print("Check connection: ")
- var x, y int
- fmt.Scan(&x, &y)
- fmt.Println(ds.isConnected(x, y))
- }
|