← Home
For problem statement at 1000-1999/1400-1499/1480-1489/1482/problemF.txt this is a correct solution, but verifier at 1000-1999/1400-1499/1480-1489/1482/verifierF.go ends with All tests passed can you fix the verifier? package main

import (
	"fmt"
	"io"
	"os"
)

type FastScanner struct {
	data []byte
	idx  int
}

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

type Edge struct {
	u, v int
	w    int64
}

type Query struct {
	to int
	l  int64
}

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

	n := fs.NextInt()
	m := fs.NextInt()

	const INF int64 = 1 << 60
	const NEG int64 = -1 << 60

	dist := make([]int64, n*n)
	for i := range dist {
		dist[i] = INF
	}
	for i := 0; i < n; i++ {
		dist[i*n+i] = 0
	}

	edges := make([]Edge, m)
	for i := 0; i < m; i++ {
		u := fs.NextInt() - 1
		v := fs.NextInt() - 1
		w := int64(fs.NextInt())
		edges[i] = Edge{u: u, v: v, w: w}
		dist[u*n+v] = w
		dist[v*n+u] = w
	}

	for k := 0; k < n; k++ {
		dk := dist[k*n : (k+1)*n]
		for i := 0; i < n; i++ {
			di := dist[i*n : (i+1)*n]
			ik := di[k]
			if ik == INF {
				continue
			}
			for j := 0; j < n; j++ {
				nd := ik + dk[j]
				if nd < di[j] {
					di[j] = nd
				}
			}
		}
	}

	q := fs.NextInt()
	qs := make([][]Query, n)
	for i := 0; i < q; i++ {
		u := fs.NextInt() - 1
		v := fs.NextInt() - 1
		l := int64(fs.NextInt())
		qs[u] = append(qs[u], Query{to: v, l: l})
		qs[v] = append(qs[v], Query{to: u, l: l})
	}

	useful := make([]bool, m)
	best := make([]int64, n)
	remaining := m

	for s := 0; s < n && remaining > 0; s++ {
		if len(qs[s]) == 0 {
			continue
		}
		for i := 0; i < n; i++ {
			best[i] = NEG
		}
		for _, qu := range qs[s] {
			dt := dist[qu.to*n : (qu.to+1)*n]
			lim := qu.l
			for x := 0; x < n; x++ {
				val := lim - dt[x]
				if val > best[x] {
					best[x] = val
				}
			}
		}
		ds := dist[s*n : (s+1)*n]
		for i, e := range edges {
			if useful[i] {
				continue
			}
			if ds[e.u]+e.w <= best[e.v] || ds[e.v]+e.w <= best[e.u] {
				useful[i] = true
				remaining--
			}
		}
	}

	fmt.Println(m - remaining)
}