| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | package mainimport (	"container/heap"	"fmt"	"math")func main() {	var n, m, src int	fmt.Scan(&n, &m, &src)	adj := make([][]int, n)	length := make([][]int, n)	for i := range length {		length[i] = make([]int, n)	}	for i := 0; i < m; i++ {		var u, v, l int		fmt.Scan(&u, &v, &l)		adj[u] = append(adj[u], v)		length[u][v] = l	}	dist, prev := dijkstra(adj, length, src)	fmt.Println(dist)	fmt.Println(prev)}type pair struct {	k int	w int}type minHeap []pairfunc (h minHeap) Len() int           { return len(h) }func (h minHeap) Less(i, j int) bool { return h[i].w < h[j].w }func (h minHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }func (h *minHeap) Push(x interface{}) {	*h = append(*h, x.(pair))}func (h *minHeap) Pop() interface{} {	l := len(*h)	x := (*h)[l-1]	*h = (*h)[:l-1]	return x}func dijkstra(adj [][]int, length [][]int, src int) (dist []int, prev []int) {	n := len(adj)	dist = make([]int, n)	prev = make([]int, n)	used := make([]bool, n)	for i := 0; i < n; i++ {		dist[i] = math.MaxInt32		prev[i] = -1	}	dist[src] = 0	var mh minHeap	heap.Push(&mh, pair{src, 0})	for mh.Len() != 0 {		u := heap.Pop(&mh).(pair)		if used[u.k] {			continue		}		used[u.k] = true		for _, v := range adj[u.k] {			alt := u.w + length[u.k][v]			if alt < dist[v] {				dist[v] = alt				prev[v] = u.k				heap.Push(&mh, pair{v, alt})			}		}	}	return}
 |