← Home
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 All tests passed can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"math/bits"
	"os"
)

func solve(in *bufio.Reader, out *bufio.Writer) {
	var n, m_edges int
	fmt.Fscan(in, &n, &m_edges)

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

	var f int
	fmt.Fscan(in, &f)
	h := make([]int, f+1)
	for i := 1; i <= f; i++ {
		fmt.Fscan(in, &h[i])
	}

	var k int
	fmt.Fscan(in, &k)
	p := make([]int, k)
	is_no_car := make([]bool, f+1)
	for i := 0; i < k; i++ {
		fmt.Fscan(in, &p[i])
		is_no_car[p[i]] = true
	}

	c := make([]int, k)
	for i, pi := range p {
		c[i] = h[pi]
	}

	car_dests := make([]int, 0, f-k)
	for i := 1; i <= f; i++ {
		if !is_no_car[i] {
			car_dests = append(car_dests, h[i])
		}
	}

	bfs := func(start int) []int {
		dist := make([]int, n+1)
		for i := 1; i <= n; i++ {
			dist[i] = -1
		}
		dist[start] = 0
		q := []int{start}
		for len(q) > 0 {
			u := q[0]
			q = q[1:]
			for _, v := range adj[u] {
				if dist[v] == -1 {
					dist[v] = dist[u] + 1
					q = append(q, v)
				}
			}
		}
		return dist
	}

	D0 := bfs(1)
	Dc := make([][]int, k)
	for i := 0; i < k; i++ {
		Dc[i] = bfs(c[i])
	}

	validPath := make([][]bool, 1<<k)
	for i := 0; i < (1<<k); i++ {
		validPath[i] = make([]bool, k)
	}

	for i := 0; i < k; i++ {
		if D0[c[i]] != -1 {
			validPath[1<<i][i] = true
		}
	}

	for mask := 1; mask < (1<<k); mask++ {
		for i := 0; i < k; i++ {
			if validPath[mask][i] {
				for j := 0; j < k; j++ {
					if (mask & (1 << j)) == 0 {
						if D0[c[i]] != -1 && Dc[i][c[j]] != -1 && D0[c[j]] != -1 {
							if D0[c[i]]+Dc[i][c[j]] == D0[c[j]] {
								validPath[mask|(1<<j)][j] = true
							}
						}
					}
				}
			}
		}
	}

	maximal_valid := make([][]int, n+1)
	for v := 1; v <= n; v++ {
		if D0[v] == -1 {
			continue
		}

		var valid []int
		for mask := 1; mask < (1<<k); mask++ {
			for i := 0; i < k; i++ {
				if (mask&(1<<i)) != 0 && validPath[mask][i] {
					if Dc[i][v] != -1 && D0[c[i]]+Dc[i][v] == D0[v] {
						valid = append(valid, mask)
						break
					}
				}
			}
		}

		var max_v []int
		for _, m := range valid {
			is_max := true
			for _, m2 := range valid {
				if m != m2 && (m&m2) == m {
					is_max = false
					break
				}
			}
			if is_max {
				max_v = append(max_v, m)
			}
		}
		maximal_valid[v] = max_v
	}

	dp := make([]bool, 1<<k)
	dp[0] = true

	count := make([]int, n+1)
	for _, v := range car_dests {
		count[v]++
	}

	for v := 1; v <= n; v++ {
		if count[v] == 0 {
			continue
		}
		if len(maximal_valid[v]) == 0 {
			continue
		}

		for c_idx := 0; c_idx < count[v]; c_idx++ {
			new_dp := make([]bool, 1<<k)
			copy(new_dp, dp)
			changed := false
			for _, m := range maximal_valid[v] {
				for i := 0; i < (1<<k); i++ {
					if dp[i] && !new_dp[i|m] {
						new_dp[i|m] = true
						changed = true
					}
				}
			}
			dp = new_dp
			if !changed {
				break
			}
		}
	}

	max_pop := 0
	for i := 0; i < (1<<k); i++ {
		if dp[i] {
			ones := bits.OnesCount(uint(i))
			if ones > max_pop {
				max_pop = ones
			}
		}
	}

	fmt.Fprintln(out, k-max_pop)
}

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

	var t int
	fmt.Fscan(in, &t)
	for tc := 0; tc < t; tc++ {
		solve(in, out)
	}
}