For problem statement at 0-999/0-99/70-79/70/problemE.txt this is a correct solution, but verifier at 0-999/0-99/70-79/70/verifierE.go ends with case 5 failed: expected
20
1 1 1 1 5 5 5 5
but got
20
1 1 1 1 1 6 6 1
input:
8 5
1 3 5 7 10 10 10
1 2
1 3
2 4
1 5
5 6
6 7
5 8
exit status 1 can you fix the verifier? ```go
package main
import (
"fmt"
)
func main() {
var n int
var k int64
fmt.Scan(&n, &k)
d := make([]int64, n)
for i := 1; i < n; i++ {
fmt.Scan(&d[i])
}
d[0] = 0
adj := make([][]int, n+1)
for i := 0; i < n-1; i++ {
var u, v int
fmt.Scan(&u, &v)
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
dist := make([][]int, n+1)
for i := 1; i <= n; i++ {
dist[i] = make([]int, n+1)
for j := 1; j <= n; j++ {
dist[i][j] = -1
}
dist[i][i] = 0
q := []int{i}
for len(q) > 0 {
curr := q[0]
q = q[1:]
for _, nxt := range adj[curr] {
if dist[i][nxt] == -1 {
dist[i][nxt] = dist[i][curr] + 1
q = append(q, nxt)
}
}
}
}
parent := make([]int, n+1)
children := make([][]int, n+1)
var buildTree func(u, p int)
buildTree = func(u, p int) {
parent[u] = p
for _, v := range adj[u] {
if v != p {
children[u] = append(children[u], v)
buildTree(v, u)
}
}
}
if n > 0 {
buildTree(1, 0)
}
inSubtree := make([][]bool, n+1)
for i := 1; i <= n; i++ {
inSubtree[i] = make([]bool, n+1)
}
var checkSubtree func(u, root int)
checkSubtree = func(u, root int) {
inSubtree[root][u] = true
for _, v := range children[u] {
checkSubtree(v, root)
}
}
for i := 1; i <= n; i++ {
checkSubtree(i, i)
}
postOrder := []int{}
var getPostOrder func(u int)
getPostOrder = func(u int) {
for _, v := range children[u] {
getPostOrder(v)
}
postOrder = append(postOrder, u)
}
if n > 0 {
getPostOrder(1)
}
DP := make([][]int64, n+1)
for i := 1; i <= n; i++ {
DP[i] = make([]int64, n+1)
}
BestVal := make([]int64, n+1)
BestCenter := make([]int, n+1)
costFunc := func(u, v int) int64 {
if u == v {
return k
}
return d[dist[u][v]]
}
for _, u := range postOrder {
for v := 1; v <= n; v++ {
cost := costFunc(u, v)
for _, w := range children[u] {
if inSubtree[w][v] {
cost += DP[w][v]
} else {
if DP[w][v] < BestVal[w] {
cost += DP[w][v]
} else {
cost += BestVal[w]
}
}
}
DP[u][v] = cost
}
best := int64(2e18)
bestC := -1
for x := 1; x <= n; x++ {
if inSubtree[u][x] {
if DP[u][x] < best {
best = DP[u][x]
bestC = x
}
}
}
BestVal[u] = best
BestCenter[u] = bestC
}
if n == 0 {
return
}
ansCost := BestVal[1]
ansCenter := make([]int, n+1)
var reconstruct func(u, v int)
reconstruct = func(u, v int) {
ansCenter[u] = v
for _, w := range children[u] {
if inSubtree[w][v] {
reconstruct(w, v)
} else {
if DP[w][v] <= BestVal[w] {
reconstruct(w, v)
} else {
reconstruct(w, BestCenter[w])
}
}
}
}
reconstruct(1, BestCenter[1])
fmt.Println(ansCost)
for i := 1; i <= n; i++ {
fmt.Printf("%d ", ansCenter[i])
}
fmt.Println()
}
```