← Home
For problem statement at 0-999/700-799/760-769/765/problemE.txt this is a correct solution, but verifier at 0-999/700-799/760-769/765/verifierE.go ends with All tests passed! can you fix the verifier? package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n int
	if _, err := fmt.Fscan(reader, &n); err != nil {
		return
	}

	origAdj := make([][]int, n+1)
	for i := 0; i < n-1; i++ {
		var u, v int
		fmt.Fscan(reader, &u, &v)
		origAdj[u] = append(origAdj[u], v)
		origAdj[v] = append(origAdj[v], u)
	}

	maxD := 0
	for i := 1; i <= n; i++ {
		if len(origAdj[i]) > maxD {
			maxD = len(origAdj[i])
		}
	}

	if maxD <= 2 {
		length := n - 1
		for length > 0 && length%2 == 0 {
			length /= 2
		}
		fmt.Println(length)
		return
	}

	important := make([]bool, n+1)
	for i := 1; i <= n; i++ {
		if len(origAdj[i]) != 2 {
			important[i] = true
		}
	}

	adj := make(map[int]map[int]int)
	for i := 1; i <= n; i++ {
		if important[i] {
			adj[i] = make(map[int]int)
		}
	}

	for i := 1; i <= n; i++ {
		if important[i] {
			for _, nxt := range origAdj[i] {
				prev := i
				curr := nxt
				length := 1
				for !important[curr] {
					var nextNode int
					for _, nn := range origAdj[curr] {
						if nn != prev {
							nextNode = nn
							break
						}
					}
					prev = curr
					curr = nextNode
					length++
				}
				if i < curr {
					adj[i][curr] = length
					adj[curr][i] = length
				}
			}
		}
	}

	deg3Count := 0
	activeLeaves := make(map[int]bool)

	for u := range adj {
		if len(adj[u]) >= 3 {
			deg3Count++
		} else if len(adj[u]) == 1 {
			activeLeaves[u] = true
		}
	}

	for deg3Count > 0 {
		leavesList := make([]int, 0, len(activeLeaves))
		for leaf := range activeLeaves {
			leavesList = append(leavesList, leaf)
		}

		type LeafBranch struct {
			leaf   int
			length int
		}
		branches := make(map[int][]LeafBranch)

		for _, leaf := range leavesList {
			for neighbor, length := range adj[leaf] {
				branches[neighbor] = append(branches[neighbor], LeafBranch{leaf, length})
			}
		}

		deletedAny := false

		for u, brs := range branches {
			byLen := make(map[int][]LeafBranch)
			for _, br := range brs {
				byLen[br.length] = append(byLen[br.length], br)
			}

			for _, list := range byLen {
				if len(list) > 1 {
					for i := 1; i < len(list); i++ {
						deletedAny = true
						leaf := list[i].leaf

						delete(adj[u], leaf)
						delete(adj[leaf], u)
						delete(activeLeaves, leaf)

						oldDeg := len(adj[u]) + 1
						if oldDeg == 3 {
							deg3Count--
						}
					}
				}
			}
		}

		if !deletedAny {
			fmt.Println("-1")
			return
		}

		deg2Queue := []int{}
		for u := range branches {
			if len(adj[u]) == 2 {
				deg2Queue = append(deg2Queue, u)
			} else if len(adj[u]) == 1 {
				activeLeaves[u] = true
			}
		}

		for len(deg2Queue) > 0 {
			u := deg2Queue[0]
			deg2Queue = deg2Queue[1:]

			if len(adj[u]) != 2 {
				continue
			}

			neighbors := make([]int, 0, 2)
			lengths := make([]int, 0, 2)
			for v, l := range adj[u] {
				neighbors = append(neighbors, v)
				lengths = append(lengths, l)
			}
			v, w := neighbors[0], neighbors[1]
			L1, L2 := lengths[0], lengths[1]

			delete(adj[v], u)
			delete(adj[w], u)
			delete(adj, u)

			adj[v][w] = L1 + L2
			adj[w][v] = L1 + L2
		}
	}

	length := 0
	for u := range adj {
		for _, l := range adj[u] {
			length += l
		}
	}
	length /= 2
	for length > 0 && length%2 == 0 {
		length /= 2
	}
	fmt.Println(length)
}