技巧
并查集
思路
模板题
实现
package main
import (
"bufio"
. "fmt"
"io"
"os"
)
type Node struct {
name string
parent *Node
}
// https://ac.nowcoder.com/acm/problem/23803
func NC23803(_r io.Reader, _w io.Writer) {
in, out := bufio.NewReader(_r), bufio.NewWriter(_w)
defer out.Flush()
var n, m int
Fscan(in, &n, &m)
unionFindSet := make(map[string]*Node)
for i := 0; i < n; i++ {
var name string
Fscan(in, &name)
unionFindSet[name] = &Node{name: name}
}
for i := 0; i < m; i++ {
var opt int
var name1, name2 string
Fscan(in, &opt, &name1, &name2)
if opt == 1 {
union(unionFindSet[name1], unionFindSet[name2])
} else {
Fprintln(out, same(unionFindSet[name1], unionFindSet[name2]))
}
}
}
func getRoot(node *Node) *Node {
if node.parent == nil {
return node
} else {
p := getRoot(node.parent)
node.parent = p
return p
}
}
func same(n1, n2 *Node) int {
if n1 == n2 || getRoot(n1) == getRoot(n2) {
return 1
}
return 0
}
func union(n1, n2 *Node) {
if same(n1, n2) == 0 {
getRoot(n1).parent = n2
}
}
func main() {
NC23803(os.Stdin, os.Stdout)
}

京公网安备 11010502036488号