← Home
For problem statement at 1000-1999/1400-1499/1430-1439/1433/problemG.txt this is a correct solution, but verifier at 1000-1999/1400-1499/1430-1439/1433/verifierG.go ends with All tests passed can you fix the verifier? package main

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

type edge struct{ to, w int }
type road struct{ u, v int }
type route struct{ a, b int }

type pq struct {
	v []int
	d []int
}

func (q *pq) push(v, d int) {
	q.v = append(q.v, v)
	q.d = append(q.d, d)
	q.up(len(q.v) - 1)
}

func (q *pq) pop() (int, int) {
	v, d := q.v[0], q.d[0]
	n := len(q.v) - 1
	q.v[0], q.d[0] = q.v[n], q.d[n]
	q.v = q.v[:n]
	q.d = q.d[:n]
	q.down(0, n)
	return v, d
}

func (q *pq) up(i int) {
	for i > 0 {
		p := (i - 1) / 2
		if q.d[i] >= q.d[p] {
			break
		}
		q.v[i], q.v[p] = q.v[p], q.v[i]
		q.d[i], q.d[p] = q.d[p], q.d[i]
		i = p
	}
}

func (q *pq) down(i, n int) {
	for {
		l := 2*i + 1
		if l >= n {
			break
		}
		j := l
		if r := l + 1; r < n && q.d[r] < q.d[l] {
			j = r
		}
		if q.d[i] <= q.d[j] {
			break
		}
		q.v[i], q.v[j] = q.v[j], q.v[i]
		q.d[i], q.d[j] = q.d[j], q.d[i]
		i = j
	}
}

func main() {
	in := bufio.NewReader(os.Stdin)
	var n, m, k int
	if _, err := fmt.Fscan(in, &n, &m, &k); err != nil {
		return
	}

	adj := make([][]edge, n+1)
	roads := make([]road, m)
	for i := 0; i < m; i++ {
		var u, v, w int
		fmt.Fscan(in, &u, &v, &w)
		adj[u] = append(adj[u], edge{v, w})
		adj[v] = append(adj[v], edge{u, w})
		roads[i] = road{u, v}
	}

	routes := make([]route, k)
	for i := 0; i < k; i++ {
		fmt.Fscan(in, &routes[i].a, &routes[i].b)
	}

	dist := make([][]int, n+1)
	for i := 1; i <= n; i++ {
		dist[i] = make([]int, n+1)
		for j := 1; j <= n; j++ {
			dist[i][j] = int(1e18)
		}
		dist[i][i] = 0

		q := &pq{v: make([]int, 0, 10000), d: make([]int, 0, 10000)}
		q.push(i, 0)

		for len(q.v) > 0 {
			u, d := q.pop()
			if d > dist[i][u] {
				continue
			}
			for _, e := range adj[u] {
				if nd := d + e.w; nd < dist[i][e.to] {
					dist[i][e.to] = nd
					q.push(e.to, nd)
				}
			}
		}
	}

	ans := int(1e18)
	for _, rd := range roads {
		sum := 0
		for _, rt := range routes {
			d := dist[rt.a][rt.b]
			d1 := dist[rt.a][rd.u] + dist[rd.v][rt.b]
			if d1 < d {
				d = d1
			}
			d2 := dist[rt.a][rd.v] + dist[rd.u][rt.b]
			if d2 < d {
				d = d2
			}
			sum += d
		}
		if sum < ans {
			ans = sum
		}
	}

	fmt.Println(ans)
}