面向对象,无需算法,有手就行。
以下是Go的实现,无论你学的什么语言都能看懂的。 package main
import (
"fmt"
)
type node struct {
id int
state bool
dad *node
son []*node
}
func (node *node) Drain() {
if node != nil {
node.state = false
node.dad.Drain()
}
}
func (node *node) Fill() {
if node != nil {
node.state = true
for _, son := range node.son {
son.Fill()
}
}
}
func (node *node) State() {
if node.state {
fmt.Println("1")
} else {
fmt.Println("0")
}
}
func connect(p, q int, nodes []*node) {
if p < q {
p, q = q, p
}
nodes[p].dad = nodes[q]
nodes[q].son = append(nodes[q].son, nodes[p])
}
func main() {
var n, p, q int
fmt.Scan(&n)
nodes := []*node{nil}
for i := 1; i <= n; i++ {
nodes = append(nodes, &node{
id: i,
state: false,
dad: nil,
son: nil,
})
}
for i := 1; i < n; i++ {
fmt.Scan(&p, &q)
connect(p, q, nodes)
}
fmt.Scan(&n)
for i := 0; i < n; i++ {
fmt.Scan(&p, &q)
switch p {
case 1:
nodes[q].Fill()
case 2:
nodes[q].Drain()
case 3:
nodes[q].State()
default:
fmt.Println("Invalid operation.")
}
}
}
最后必须得骂一下出题人。 后面n-1行,每行有两个数字a[i], b[i]。(1<=a[i], b[i]<= n, a[i]!=b[i])表示蓄水池的连接关系。
1 2
5 1
2 3
4 2
我一看2在第二个操作数出现两次,众所周知,树里的一个节点不可能是两个节点的子节点。所以题目虽然没说,每行输入的意思是操作数2是操作数1的父节点,一定是这样!
然后我重构了这样的树。
....3
....|
....2
.../
..1 .4
./
5
然后发现对不上后面的输出,人都傻了。后来看到 QK康哥在此 的评论才知道,小操作数是大操作数的父节点,一验证发现的确如此。建议扣出题人一个鸡腿。
我开始维护CSDN了,如果以上对你有帮助的话来点个赞吧~