← Home
For problem statement at 1000-1999/1600-1699/1680-1689/1689/problemC.txt this is a correct solution, but verifier at 1000-1999/1600-1699/1680-1689/1689/verifierC.go ends with test 16 failed
input:
1
10
1 2
2 3
1 4
1 5
5 6
5 7
2 8
4 9
7 10
expected: 2
got: 3

exit status 1 can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

type FastScanner struct {
	r *bufio.Reader
}

func NewFastScanner() *FastScanner {
	return &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}

func (fs *FastScanner) nextInt() int {
	sign := 1
	val := 0
	c, _ := fs.r.ReadByte()
	for (c < '0' || c > '9') && c != '-' {
		c, _ = fs.r.ReadByte()
	}
	if c == '-' {
		sign = -1
		c, _ = fs.r.ReadByte()
	}
	for c >= '0' && c <= '9' {
		val = val*10 + int(c-'0')
		c2, err := fs.r.ReadByte()
		if err != nil {
			break
		}
		c = c2
	}
	return sign * val
}

func main() {
	in := NewFastScanner()
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	t := in.nextInt()
	for ; t > 0; t-- {
		n := in.nextInt()
		adj := make([][]int, n+1)
		for i := 0; i < n-1; i++ {
			u := in.nextInt()
			v := in.nextInt()
			adj[u] = append(adj[u], v)
			adj[v] = append(adj[v], u)
		}

		// Build rooted tree at 1
		children := make([][]int, n+1)
		parent := make([]int, n+1)
		vis := make([]bool, n+1)
		order := make([]int, 0, n)

		stack := make([]int, 0, n)
		stack = append(stack, 1)
		vis[1] = true
		parent[1] = 0
		for len(stack) > 0 {
			u := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			order = append(order, u)
			for _, w := range adj[u] {
				if vis[w] {
					continue
				}
				vis[w] = true
				parent[w] = u
				children[u] = append(children[u], w)
				stack = append(stack, w)
			}
		}

		// Subtree sizes
		sub := make([]int, n+1)
		for i := len(order) - 1; i >= 0; i-- {
			u := order[i]
			s := 1
			for _, v := range children[u] {
				s += sub[v]
			}
			sub[u] = s
		}

		// Simulate infection by layers, deleting one best child each round
		saved := 0
		cur := []int{1}
		for len(cur) > 0 {
			next := make([]int, 0)
			for _, u := range cur {
				for _, v := range children[u] {
					next = append(next, v)
				}
			}
			if len(next) == 0 {
				break
			}
			// choose child with maximum subtree size to delete
			maxIdx := 0
			maxSz := sub[next[0]]
			for i := 1; i < len(next); i++ {
				if sub[next[i]] > maxSz {
					maxSz = sub[next[i]]
					maxIdx = i
				}
			}
			saved += maxSz - 1
			// build next infected excluding the deleted one
			newCur := make([]int, 0, len(next)-1)
			for i, v := range next {
				if i == maxIdx {
					continue
				}
				newCur = append(newCur, v)
			}
			cur = newCur
		}

		fmt.Fprintln(out, saved)
	}
}
```