← Home
For problem statement at 0-999/700-799/720-729/721/problemC.txt this is a correct solution, but verifier at 0-999/700-799/720-729/721/verifierC.go ends with All 105 tests passed can you fix the verifier? package main

import (
	"bytes"
	"io"
	"os"
	"strconv"
)

type FastScanner struct {
	data []byte
	idx  int
}

func (fs *FastScanner) nextInt() int {
	n := len(fs.data)
	for fs.idx < n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
	val := 0
	for fs.idx < n && fs.data[fs.idx] > ' ' {
		val = val*10 + int(fs.data[fs.idx]-'0')
		fs.idx++
	}
	return val
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	fs := FastScanner{data: data}

	n := fs.nextInt()
	m := fs.nextInt()
	T := fs.nextInt()

	head := make([]int, n+1)
	for i := range head {
		head[i] = -1
	}

	to := make([]int, m)
	wt := make([]uint32, m)
	next := make([]int, m)
	indeg := make([]int, n+1)

	for i := 0; i < m; i++ {
		u := fs.nextInt()
		v := fs.nextInt()
		t := fs.nextInt()
		to[i] = v
		wt[i] = uint32(t)
		next[i] = head[u]
		head[u] = i
		indeg[v]++
	}

	queue := make([]int, n)
	front, back := 0, 0
	for i := 1; i <= n; i++ {
		if indeg[i] == 0 {
			queue[back] = i
			back++
		}
	}

	order := make([]int, 0, n)
	for front < back {
		u := queue[front]
		front++
		order = append(order, u)
		for e := head[u]; e != -1; e = next[e] {
			v := to[e]
			indeg[v]--
			if indeg[v] == 0 {
				queue[back] = v
				back++
			}
		}
	}

	cols := n + 1
	size := cols * cols

	dp := make([]uint32, size)
	parent := make([]uint16, size)
	base := make([]int, n+1)
	for i := 1; i <= n; i++ {
		base[i] = i * cols
	}

	dp[base[1]+1] = 1
	limit := uint32(T) + 1

	for _, u := range order {
		bu := base[u]
		for l := 1; l < n; l++ {
			cur := dp[bu+l]
			if cur == 0 {
				continue
			}
			for e := head[u]; e != -1; e = next[e] {
				cand := cur + wt[e]
				if cand > limit {
					continue
				}
				pos := base[to[e]] + l + 1
				if dp[pos] == 0 || cand < dp[pos] {
					dp[pos] = cand
					parent[pos] = uint16(u)
				}
			}
		}
	}

	k := 0
	bn := base[n]
	for l := n; l >= 1; l-- {
		if dp[bn+l] != 0 {
			k = l
			break
		}
	}

	path := make([]int, k)
	cur := n
	for l := k; l >= 1; l-- {
		path[l-1] = cur
		if l > 1 {
			cur = int(parent[base[cur]+l])
		}
	}

	var out bytes.Buffer
	out.WriteString(strconv.Itoa(k))
	out.WriteByte('\n')
	for i, v := range path {
		if i > 0 {
			out.WriteByte(' ')
		}
		out.WriteString(strconv.Itoa(v))
	}
	out.WriteByte('\n')
	os.Stdout.Write(out.Bytes())
}