← Home
For problem statement at 1000-1999/1300-1399/1380-1389/1387/problemB1.txt this is a correct solution, but verifier at 1000-1999/1300-1399/1380-1389/1387/verifierB1.go ends with case 1 failed: expected 6
3 1 2 5 4 got 6
2 3 1 5 4
input:
5
1 2
1 3
2 4
4 5
exit status 1 can you fix the verifier?  ```go
package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n int
	fmt.Fscan(reader, &n)

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

	match := make([]int, n+1)
	removed := make([]bool, n+1)
	deg := make([]int, n+1)
	for i := 1; i <= n; i++ {
		deg[i] = len(adj[i])
	}

	queue := make([]int, 0)
	for i := 1; i <= n; i++ {
		if deg[i] == 1 {
			queue = append(queue, i)
		}
	}

	type edge struct{ u, v int }
	matchedEdges := make([]edge, 0)

	for len(queue) > 0 {
		v := queue[0]
		queue = queue[1:]
		if removed[v] || deg[v] == 0 {
			continue
		}
		var u int = -1
		for _, w := range adj[v] {
			if !removed[w] {
				u = w
				break
			}
		}
		if u == -1 {
			continue
		}
		match[v] = u
		match[u] = v
		matchedEdges = append(matchedEdges, edge{v, u})
		removed[v] = true
		removed[u] = true

		for _, w := range adj[v] {
			if !removed[w] {
				deg[w]--
				if deg[w] == 1 {
					queue = append(queue, w)
				}
			}
		}
		for _, w := range adj[u] {
			if !removed[w] {
				deg[w]--
				if deg[w] == 1 {
					queue = append(queue, w)
				}
			}
		}
	}

	m := len(matchedEdges)
	fmt.Fprintln(writer, 2*(n-m))

	ans := make([]int, n+1)
	edgeIdx := make([]int, n+1)
	for i := range edgeIdx {
		edgeIdx[i] = -1
	}
	for i, e := range matchedEdges {
		edgeIdx[e.u] = i
		edgeIdx[e.v] = i
	}

	type lists struct{ uList, vList []int }
	edgeLists := make([]lists, len(matchedEdges))

	for x := 1; x <= n; x++ {
		if match[x] == 0 {
			for _, y := range adj[x] {
				if match[y] != 0 {
					idx := edgeIdx[y]
					e := matchedEdges[idx]
					if y == e.u {
						edgeLists[idx].uList = append(edgeLists[idx].uList, x)
					} else {
						edgeLists[idx].vList = append(edgeLists[idx].vList, x)
					}
					break
				}
			}
		}
	}

	for i, e := range matchedEdges {
		u, v := e.u, e.v
		ul, vl := edgeLists[i].uList, edgeLists[i].vList
		if len(ul) == 0 && len(vl) == 0 {
			ans[u] = v
			ans[v] = u
		} else {
			prev := u
			for _, x := range ul {
				ans[prev] = x
				prev = x
			}
			ans[prev] = v
			prev = v
			for _, x := range vl {
				ans[prev] = x
				prev = x
			}
			ans[prev] = u
		}
	}

	for i := 1; i <= n; i++ {
		if i > 1 {
			fmt.Fprint(writer, " ")
		}
		fmt.Fprint(writer, ans[i])
	}
	fmt.Fprintln(writer)
}
```