← Home
package main

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

var (
	head []int
	next []int
	to   []int
	dp0  []int
	dp1  []int
	deg  []int
	edgeCount int
	alpha     int
	found     bool
)

func dfs1(u, p int) {
	dp0[u] = 0
	dp1[u] = 1
	for e := head[u]; e != 0; e = next[e] {
		v := to[e]
		if v != p {
			dfs1(v, u)
			if dp0[v] > dp1[v] {
				dp0[u] += dp0[v]
			} else {
				dp0[u] += dp1[v]
			}
			dp1[u] += dp0[v]
		}
	}
}

func dfs2(u, p, out0, out1 int) {
	S0 := 0
	S1 := 1
	if p != 0 {
		if out0 > out1 {
			S0 += out0
		} else {
			S0 += out1
		}
		S1 += out0
	}
	for e := head[u]; e != 0; e = next[e] {
		v := to[e]
		if v != p {
			if dp0[v] > dp1[v] {
				S0 += dp0[v]
			} else {
				S0 += dp1[v]
			}
			S1 += dp0[v]
		}
	}

	if deg[u] == 1 && S0 == alpha {
		found = true
	}

	if found {
		return
	}

	for e := head[u]; e != 0; e = next[e] {
		v := to[e]
		if v != p {
			vMax := dp0[v]
			if dp1[v] > dp0[v] {
				vMax = dp1[v]
			}
			nxtOut0 := S0 - vMax
			nxtOut1 := S1 - dp0[v]
			dfs2(v, u, nxtOut0, nxtOut1)
			if found {
				return
			}
		}
	}
}

func main() {
	buf := make([]byte, 8192)
	var pos, length int
	readByte := func() byte {
		if pos >= length {
			pos = 0
			n, err := os.Stdin.Read(buf)
			if err != nil || n == 0 {
				return 0
			}
			length = n
		}
		b := buf[pos]
		pos++
		return b
	}

	nextInt := func() int {
		var res int
		b := readByte()
		for b <= ' ' {
			if b == 0 {
				return 0
			}
			b = readByte()
		}
		for b > ' ' {
			res = res*10 + int(b-'0')
			b = readByte()
		}
		return res
	}

	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	t := nextInt()
	if t == 0 {
		return
	}

	maxN := 300005
	head = make([]int, maxN)
	next = make([]int, maxN*2)
	to = make([]int, maxN*2)
	dp0 = make([]int, maxN)
	dp1 = make([]int, maxN)
	deg = make([]int, maxN)

	for tc := 0; tc < t; tc++ {
		n := nextInt()
		edgeCount = 0
		found = false

		for i := 1; i <= n; i++ {
			head[i] = 0
			deg[i] = 0
		}

		addEdge := func(u, v int) {
			edgeCount++
			to[edgeCount] = v
			next[edgeCount] = head[u]
			head[u] = edgeCount
			deg[u]++
		}

		for i := 0; i < n-1; i++ {
			u := nextInt()
			v := nextInt()
			addEdge(u, v)
			addEdge(v, u)
		}

		dfs1(1, 0)

		alpha = dp0[1]
		if dp1[1] > dp0[1] {
			alpha = dp1[1]
		}

		dfs2(1, 0, 0, 0)

		if found {
			fmt.Fprintln(writer, alpha+1)
		} else {
			fmt.Fprintln(writer, alpha)
		}
	}
}