← Home
For problem statement at 0-999/600-699/690-699/690/problemF3.txt this is a correct solution, but verifier at 0-999/600-699/690-699/690/verifierF3.go ends with candidate runtime error on det-small-yes: runtime error: exit status 2
panic: runtime error: index out of range [0] with length 0

goroutine 1 [running]:
main.getTreeID({0x400006ee40, 0x0, 0x0}, 0xffffffffffffffff)
	/tmp/build-3899731365/solution.go:96 +0xd8
main.main()
	/tmp/build-3899731365/solution.go:156 +0x7a8

input:
1
4 2
2
1 2
2 3
1
1 2
exit status 1 can you fix the verifier? package main

import (
	"fmt"
	"sort"
	"strconv"
	"strings"
)

type TreeID struct {
	id1, id2 int
}

var memo = make(map[string]int)
var idCounter int

func getId(children []int) int {
	if len(children) == 0 {
		return 0
	}
	sort.Ints(children)
	var sb strings.Builder
	for _, c := range children {
		sb.WriteString(strconv.Itoa(c))
		sb.WriteByte(',')
	}
	s := sb.String()
	if id, ok := memo[s]; ok {
		return id
	}
	idCounter++
	memo[s] = idCounter
	return idCounter
}

func getCentersIgnore(adj [][]int, ignore int) []int {
	n := len(adj)
	degree := make([]int, n)
	var leaves []int
	active := 0
	for i := 0; i < n; i++ {
		if i == ignore {
			continue
		}
		active++
		d := 0
		for _, v := range adj[i] {
			if v != ignore {
				d++
			}
		}
		degree[i] = d
		if d <= 1 {
			leaves = append(leaves, i)
			degree[i] = 0
		}
	}
	count := len(leaves)
	for count < active {
		var newLeaves []int
		for _, u := range leaves {
			for _, v := range adj[u] {
				if v == ignore {
					continue
				}
				if degree[v] > 0 {
					degree[v]--
					if degree[v] == 1 {
						newLeaves = append(newLeaves, v)
					}
				}
			}
		}
		count += len(newLeaves)
		leaves = newLeaves
	}
	return leaves
}

func dfsID(adj [][]int, u, p, ignore int) int {
	var children []int
	for _, v := range adj[u] {
		if v != p && v != ignore {
			children = append(children, dfsID(adj, v, u, ignore))
		}
	}
	return getId(children)
}

func getTreeID(adj [][]int, ignore int) TreeID {
	centers := getCentersIgnore(adj, ignore)
	if len(centers) == 1 {
		id := dfsID(adj, centers[0], -1, ignore)
		return TreeID{id, id}
	} else {
		id1 := dfsID(adj, centers[0], -1, ignore)
		id2 := dfsID(adj, centers[1], -1, ignore)
		if id1 > id2 {
			id1, id2 = id2, id1
		}
		return TreeID{id1, id2}
	}
}

func main() {
	var n, k int
	if _, err := fmt.Scan(&n, &k); err != nil {
		return
	}

	if n == 2 {
		fmt.Println("1 2")
		return
	}

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

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

	var leaves1 []int
	for i := 0; i < n-1; i++ {
		if len(adj1[i]) == 1 {
			leaves1 = append(leaves1, i)
		}
	}

	var leaves2 []int
	for i := 0; i < n-1; i++ {
		if len(adj2[i]) == 1 {
			leaves2 = append(leaves2, i)
		}
	}

	validCores := make(map[TreeID]bool)
	for _, l2 := range leaves2 {
		id := getTreeID(adj2, l2)
		validCores[id] = true
	}

	targetID := getTreeID(adj2, -1)

	for _, l1 := range leaves1 {
		coreID := getTreeID(adj1, l1)
		if !validCores[coreID] {
			continue
		}

		for v := 0; v < n-1; v++ {
			if v == l1 {
				continue
			}

			adjCand := make([][]int, n-1)
			for i := 0; i < n-1; i++ {
				if i == l1 {
					continue
				}
				for _, neighbor := range adj1[i] {
					if neighbor != l1 {
						adjCand[i] = append(adjCand[i], neighbor)
					}
				}
			}

			adjCand[l1] = append(adjCand[l1], v)
			adjCand[v] = append(adjCand[v], l1)

			if getTreeID(adjCand, -1) == targetID {
				for i := 0; i < n-1; i++ {
					for _, neighbor := range adj1[i] {
						if i < neighbor {
							fmt.Println(i+1, neighbor+1)
						}
					}
				}
				fmt.Println(v+1, n)
				return
			}
		}
	}
}