← Home
For problem statement at 0-999/500-599/560-569/567/problemE.txt this is a correct solution, but verifier at 0-999/500-599/560-569/567/verifierE.go ends with All tests passed can you fix the verifier? package main

import (
	"bufio"
	"container/heap"
	"fmt"
	"os"
)

type Edge struct {
	to     int
	weight int64
}

type IntPair struct {
	x, y int64
}

type Item struct {
	v    int
	dist int64
}

type PriorityQueue []*Item

func (pq PriorityQueue) Len() int { return len(pq) }

func (pq PriorityQueue) Less(i, j int) bool {
	return pq[i].dist < pq[j].dist
}

func (pq PriorityQueue) Swap(i, j int) {
	pq[i], pq[j] = pq[j], pq[i]
}

func (pq *PriorityQueue) Push(x interface{}) {
	*pq = append(*pq, x.(*Item))
}

func (pq *PriorityQueue) Pop() interface{} {
	old := *pq
	n := len(old)
	item := old[n-1]
	*pq = old[0 : n-1]
	return item
}

func dijkstra(start int, n int, adj [][]Edge) ([]int64, []IntPair) {
	dist := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		dist[i] = 1e18
	}
	ways := make([]IntPair, n+1)
	visited := make([]bool, n+1)

	dist[start] = 0
	ways[start] = IntPair{1, 1}

	pq := make(PriorityQueue, 0)
	heap.Push(&pq, &Item{v: start, dist: 0})

	for pq.Len() > 0 {
		top := heap.Pop(&pq).(*Item)
		u := top.v
		if visited[u] {
			continue
		}
		visited[u] = true

		for _, edge := range adj[u] {
			v := edge.to
			w := edge.weight

			if dist[u]+w < dist[v] {
				dist[v] = dist[u] + w
				ways[v] = ways[u]
				heap.Push(&pq, &Item{v: v, dist: dist[v]})
			} else if dist[u]+w == dist[v] {
				ways[v].x = (ways[v].x + ways[u].x) % 1000000007
				ways[v].y = (ways[v].y + ways[u].y) % 1000000009
			}
		}
	}
	return dist, ways
}

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

	var n, m, s, t int
	fmt.Fscanf(reader, "%d %d %d %d\n", &n, &m, &s, &t)

	adjS := make([][]Edge, n+1)
	adjT := make([][]Edge, n+1)

	edges := make([][3]int, m)

	for i := 0; i < m; i++ {
		var u, v int
		var w int64
		fmt.Fscanf(reader, "%d %d %d\n", &u, &v, &w)
		edges[i] = [3]int{u, v, int(w)}
		adjS[u] = append(adjS[u], Edge{v, w})
		adjT[v] = append(adjT[v], Edge{u, w})
	}

	distS, waysS := dijkstra(s, n, adjS)
	distT, waysT := dijkstra(t, n, adjT)

	L := distS[t]

	for i := 0; i < m; i++ {
		u := edges[i][0]
		v := edges[i][1]
		w := int64(edges[i][2])

		if distS[u]+w+distT[v] == L {
			if (waysS[u].x*waysT[v].x)%1000000007 == waysS[t].x &&
				(waysS[u].y*waysT[v].y)%1000000009 == waysS[t].y {
				fmt.Fprintln(writer, "YES")
				continue
			}
		}

		reqW := L - 1 - distS[u] - distT[v]
		if reqW >= 1 {
			fmt.Fprintf(writer, "CAN %d\n", w-reqW)
		} else {
			fmt.Fprintln(writer, "NO")
		}
	}
}