For problem statement at 1000-1999/1700-1799/1740-1749/1741/problemG.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1740-1749/1741/verifierG.go ends with case 24 failed: expected 0 got 2
input: {n:5 m:3 edges:[[2 3] [3 4] [3 5]] f:5 h:[1 5 1 5 5] k:3 p:[3 2 5]}
exit status 1 can you fix the verifier? ```go
package main
import (
"bufio"
"fmt"
"math/bits"
"os"
"sort"
)
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var t int
fmt.Fscan(reader, &t)
for tc := 0; tc < t; tc++ {
var n, m int
fmt.Fscan(reader, &n, &m)
adj := make([][]int, n+1)
for i := 0; i < m; i++ {
var u, v int
fmt.Fscan(reader, &u, &v)
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
var f int
fmt.Fscan(reader, &f)
h := make([]int, f)
for i := 0; i < f; i++ {
fmt.Fscan(reader, &h[i])
}
var k int
fmt.Fscan(reader, &k)
p := make([]int, k)
for i := 0; i < k; i++ {
fmt.Fscan(reader, &p[i])
p[i]--
}
dist1 := bfs(1, adj, n)
home := make([]int, k)
distFriends := make([][]int, k)
for i := 0; i < k; i++ {
home[i] = h[p[i]]
distFriends[i] = bfs(home[i], adj, n)
}
isDriver := make([]bool, f)
for i := 0; i < f; i++ {
isDriver[i] = true
}
for _, idx := range p {
isDriver[idx] = false
}
drivers := []int{}
for i := 0; i < f; i++ {
if isDriver[i] {
drivers = append(drivers, h[i])
}
}
dp := make([]bool, 1<<k)
dp[0] = true
for _, d := range drivers {
if dist1[d] < 0 {
continue
}
maskReachable := 0
for i := 0; i < k; i++ {
if dist1[home[i]] >= 0 && distFriends[i][d] >= 0 && dist1[home[i]]+distFriends[i][d] == dist1[d] {
maskReachable |= (1 << i)
}
}
validSubsets := []int{0}
sub := maskReachable
for {
if sub != 0 && isValidChain(sub, dist1, distFriends, home, d) {
validSubsets = append(validSubsets, sub)
}
if sub == 0 {
break
}
sub = (sub - 1) & maskReachable
}
newDp := make([]bool, 1<<k)
copy(newDp, dp)
for mask := 0; mask < (1 << k); mask++ {
if dp[mask] {
for _, s := range validSubsets {
if mask&s == 0 {
newDp[mask|s] = true
}
}
}
}
dp = newDp
}
maxCovered := 0
for mask := 0; mask < (1 << k); mask++ {
if dp[mask] {
cnt := bits.OnesCount(uint(mask))
if cnt > maxCovered {
maxCovered = cnt
}
}
}
fmt.Fprintln(writer, k-maxCovered)
}
}
func bfs(start int, adj [][]int, n int) []int {
dist := make([]int, n+1)
for i := range dist {
dist[i] = -1
}
dist[start] = 0
q := make([]int, 0, n)
q = append(q, start)
head := 0
for head < len(q) {
u := q[head]
head++
for _, v := range adj[u] {
if dist[v] == -1 {
dist[v] = dist[u] + 1
q = append(q, v)
}
}
}
return dist
}
func isValidChain(mask int, dist1 []int, distFriends [][]int, home []int, driverVertex int) bool {
if mask == 0 {
return true
}
idxs := []int{}
for i := 0; i < len(home); i++ {
if mask&(1<<i) != 0 {
idxs = append(idxs, i)
}
}
sort.Slice(idxs, func(i, j int) bool {
return dist1[home[idxs[i]]] < dist1[home[idxs[j]]]
})
for i := 0; i < len(idxs)-1; i++ {
u := idxs[i]
v := idxs[i+1]
if dist1[home[u]]+distFriends[u][home[v]] != dist1[home[v]] {
return false
}
}
last := idxs[len(idxs)-1]
if dist1[home[last]]+distFriends[last][driverVertex] != dist1[driverVertex] {
return false
}
return true
}
```