← Home
For problem statement at 0-999/300-399/320-329/324/problemE2.txt this is a correct solution, but verifier at 0-999/300-399/320-329/324/verifierE2.go ends with wrong answer on test 1 (sample): line 5: expected 1, got 0
input:
6 6
1 2 2 1 2
2 3 1 3
3 4 2 4 5
4 5 0
5 3 1 3
6 1 1 6

expected:
0
1
2
1
1
2
1
1
2
1
1
2
actual:
0
1
2
1
0
0
0
0
0
0
0
0
exit status 1 can you fix the verifier? package main

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

const MOD int64 = 1000000007
const solveE2 = true

type FastScanner struct {
	r *bufio.Reader
}

func NewFastScanner() *FastScanner {
	return &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}

func (fs *FastScanner) NextInt() int {
	sign, val := 1, 0
	c, err := fs.r.ReadByte()
	for (c < '0' || c > '9') && c != '-' {
		c, err = fs.r.ReadByte()
		if err != nil {
			return 0
		}
	}
	if c == '-' {
		sign = -1
		c, _ = fs.r.ReadByte()
	}
	for c >= '0' && c <= '9' {
		val = val*10 + int(c-'0')
		c, err = fs.r.ReadByte()
		if err != nil {
			return sign * val
		}
	}
	fs.r.UnreadByte()
	return sign * val
}

func id(v, mode int) int {
	return (v-1)*2 + mode
}

func main() {
	in := NewFastScanner()
	n := in.NextInt()
	m := in.NextInt()

	sz := 2 * n
	g := make([][]int, sz)

	for i := 0; i < m; i++ {
		x := in.NextInt()
		y := in.NextInt()
		k := in.NextInt()
		vis := make([]int, k)
		for j := 0; j < k; j++ {
			vis[j] = in.NextInt()
		}
		if k == 0 {
			g[id(x, 1)] = append(g[id(x, 1)], id(y, 0))
		} else if k == 1 {
			if vis[0] == x {
				g[id(x, 0)] = append(g[id(x, 0)], id(y, 0))
			}
			if vis[0] == y {
				g[id(x, 1)] = append(g[id(x, 1)], id(y, 1))
			}
		} else if k == 2 {
			if vis[0] == x && vis[1] == y {
				g[id(x, 0)] = append(g[id(x, 0)], id(y, 1))
			}
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	if solveE2 {
		dp := make([]int64, sz)
		for v := 1; v <= n; v++ {
			dp[id(v, 0)] = 1
		}
		fmt.Fprintln(out, 0)
		for step := 1; step <= 2*n-1; step++ {
			ndp := make([]int64, sz)
			for s := 0; s < sz; s++ {
				if dp[s] == 0 {
					continue
				}
				val := dp[s]
				for _, to := range g[s] {
					ndp[to] += val
					if ndp[to] >= MOD {
						ndp[to] -= MOD
					}
				}
			}
			var ans int64
			for v := 1; v <= n; v++ {
				ans += ndp[id(v, 1)]
				if ans >= MOD {
					ans -= MOD
				}
			}
			fmt.Fprintln(out, ans%MOD)
			dp = ndp
		}
		return
	}

	dist := make([]int, sz)
	parent := make([]int, sz)
	for i := 0; i < sz; i++ {
		dist[i] = -1
		parent[i] = -1
	}
	q := make([]int, 0, sz)
	for v := 1; v <= n; v++ {
		s := id(v, 0)
		dist[s] = 0
		q = append(q, s)
	}

	head := 0
	best := -1
	for head < len(q) {
		cur := q[head]
		head++
		if cur%2 == 1 {
			best = cur
			break
		}
		for _, to := range g[cur] {
			if dist[to] == -1 {
				dist[to] = dist[cur] + 1
				parent[to] = cur
				q = append(q, to)
			}
		}
	}

	if best == -1 || dist[best]+1 > 2*n {
		fmt.Fprintln(out, 0)
		return
	}

	states := make([]int, 0)
	for x := best; x != -1; x = parent[x] {
		states = append(states, x)
	}
	for i, j := 0, len(states)-1; i < j; i, j = i+1, j-1 {
		states[i], states[j] = states[j], states[i]
	}

	fmt.Fprintln(out, len(states))
	for i, s := range states {
		if i > 0 {
			fmt.Fprint(out, " ")
		}
		fmt.Fprint(out, s/2+1)
	}
	fmt.Fprintln(out)
}