← Home
For problem statement at 2000-2999/2100-2199/2100-2109/2109/problemD.txt this is a correct solution, but verifier at 2000-2999/2100-2199/2100-2109/2109/verifierD.go ends with All 35 tests passed can you fix the verifier? package main

import (
	"bufio"
	"os"
)

func nextInt(r *bufio.Reader) int {
	var res int
	b, err := r.ReadByte()
	if err != nil {
		return 0
	}
	for b <= ' ' {
		b, err = r.ReadByte()
		if err != nil {
			return 0
		}
	}
	for b > ' ' {
		res = res*10 + int(b-'0')
		b, err = r.ReadByte()
		if err != nil {
			break
		}
	}
	return res
}

func main() {
	r := bufio.NewReaderSize(os.Stdin, 65536)
	w := bufio.NewWriterSize(os.Stdout, 65536)
	defer w.Flush()

	t := nextInt(r)
	for i := 0; i < t; i++ {
		n := nextInt(r)
		m := nextInt(r)
		l := nextInt(r)

		minOdd := int64(-1)
		sumAll := int64(0)

		for j := 0; j < l; j++ {
			a := int64(nextInt(r))
			sumAll += a
			if a%2 != 0 {
				if minOdd == -1 || a < minOdd {
					minOdd = a
				}
			}
		}

		adj := make([][]int, n+1)
		for j := 0; j < m; j++ {
			u := nextInt(r)
			v := nextInt(r)
			adj[u] = append(adj[u], v)
			adj[v] = append(adj[v], u)
		}

		var L_even, L_odd int64
		if sumAll%2 == 0 {
			L_even = sumAll
			if minOdd != -1 {
				L_odd = sumAll - minOdd
			} else {
				L_odd = -1
			}
		} else {
			L_odd = sumAll
			L_even = sumAll - minOdd
		}

		if L_even < 0 {
			L_even = 0
		}

		d0 := make([]int64, n+1)
		d1 := make([]int64, n+1)
		for j := 1; j <= n; j++ {
			d0[j] = -1
			d1[j] = -1
		}

		d0[1] = 0
		queue := make([]int, 0, 4*n)
		queue = append(queue, 1, 0)
		head := 0

		for head < len(queue) {
			u := queue[head]
			p := queue[head+1]
			head += 2

			if p == 0 {
				d := d0[u]
				for _, v := range adj[u] {
					if d1[v] == -1 {
						d1[v] = d + 1
						queue = append(queue, v, 1)
					}
				}
			} else {
				d := d1[u]
				for _, v := range adj[u] {
					if d0[v] == -1 {
						d0[v] = d + 1
						queue = append(queue, v, 0)
					}
				}
			}
		}

		result := make([]byte, n)
		for j := 1; j <= n; j++ {
			canReach := false
			if d0[j] != -1 && d0[j] <= L_even {
				canReach = true
			}
			if L_odd != -1 && d1[j] != -1 && d1[j] <= L_odd {
				canReach = true
			}

			if canReach {
				result[j-1] = '1'
			} else {
				result[j-1] = '0'
			}
		}

		w.Write(result)
		w.WriteByte('\n')
	}
}