For problem statement at 1000-1999/1900-1999/1940-1949/1949/problemC.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1940-1949/1949/verifierC.go ends with All tests passed can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
"sort"
)
func nextInt(reader *bufio.Reader) int {
sign := 1
val := 0
c, err := reader.ReadByte()
for err == nil && (c < '0' || c > '9') && c != '-' {
c, err = reader.ReadByte()
}
if err != nil {
return 0
}
if c == '-' {
sign = -1
c, _ = reader.ReadByte()
}
for c >= '0' && c <= '9' {
val = val*10 + int(c-'0')
c, err = reader.ReadByte()
if err != nil {
break
}
}
return sign * val
}
func build(adj [][]int, root int) ([]int, []int) {
n := len(adj)
parent := make([]int, n)
for i := range parent {
parent[i] = -1
}
stack := make([]int, 0, n)
order := make([]int, 0, n)
parent[root] = -2
stack = append(stack, root)
for len(stack) > 0 {
v := stack[len(stack)-1]
stack = stack[:len(stack)-1]
order = append(order, v)
for _, u := range adj[v] {
if parent[u] == -1 {
parent[u] = v
stack = append(stack, u)
}
}
}
size := make([]int, n)
for i := len(order) - 1; i >= 0; i-- {
v := order[i]
sz := 1
for _, u := range adj[v] {
if parent[u] == v {
sz += size[u]
}
}
size[v] = sz
}
parent[root] = -1
return parent, size
}
func centroids(adj [][]int) []int {
n := len(adj)
parent, size := build(adj, 0)
res := []int{}
for v := 0; v < n; v++ {
maxPart := n - size[v]
for _, u := range adj[v] {
if parent[u] == v {
if size[u] > maxPart {
maxPart = size[u]
}
}
}
if maxPart*2 <= n {
res = append(res, v)
}
}
return res
}
func validWithRoot(adj [][]int, r int) bool {
parent, size := build(adj, r)
n := len(adj)
for v := 0; v < n; v++ {
childrenSizes := make([]int, 0, len(adj[v]))
for _, u := range adj[v] {
if parent[u] == v {
childrenSizes = append(childrenSizes, size[u])
}
}
if len(childrenSizes) == 0 {
continue
}
sort.Ints(childrenSizes)
cur := 1
for _, a := range childrenSizes {
if a > cur {
return false
}
cur += a
}
}
return true
}
func main() {
reader := bufio.NewReader(os.Stdin)
n := nextInt(reader)
adj := make([][]int, n)
for i := 0; i < n-1; i++ {
u := nextInt(reader) - 1
v := nextInt(reader) - 1
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
if n == 1 {
fmt.Println("YES")
return
}
cents := centroids(adj)
for _, r := range cents {
if validWithRoot(adj, r) {
fmt.Println("YES")
return
}
}
fmt.Println("NO")
}