Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 "container/heap"6 . "fmt"7 "io"8)9 1011type vd51 struct {12 v int13 dis int6414}15type hp51 []vd5116 17func (h hp51) Len() int { return len(h) }18func (h hp51) Less(i, j int) bool { return h[i].dis < h[j].dis }19func (h hp51) Swap(i, j int) { h[i], h[j] = h[j], h[i] }20func (h *hp51) Push(v interface{}) { *h = append(*h, v.(vd51)) }21func (h *hp51) Pop() (v interface{}) { a := *h; *h, v = a[:len(a)-1], a[len(a)-1]; return }22func (h *hp51) push(v vd51) { heap.Push(h, v) }23func (h *hp51) pop() vd51 { return heap.Pop(h).(vd51) }24 25func CF1051F(_r io.Reader, _w io.Writer) {26 in := bufio.NewReader(_r)27 out := bufio.NewWriter(_w)28 defer out.Flush()29 min := func(a, b int64) int64 {30 if a > b {31 return b32 }33 return a34 }35 36 var n, m, q, v, w, wt int37 Fscan(in, &n, &m)38 type nb struct{ to, wt int }39 g := make([][]nb, n)40 for i := 0; i < m; i++ {41 Fscan(in, &v, &w, &wt)42 v--43 w--44 g[v] = append(g[v], nb{w, wt})45 g[w] = append(g[w], nb{v, wt})46 }47 48 spV := map[int]bool{}49 const mx = 1750 pa := make([][mx]int, n)51 dep := make([]int, n)52 dep2 := make([]int64, n)53 var f func(int, int)54 f = func(v, fa int) {55 pa[v][0] = fa56 for _, e := range g[v] {57 w := e.to58 if dep[w] == 0 {59 dep[w] = dep[v] + 160 dep2[w] = dep2[v] + int64(e.wt)61 f(w, v)62 } else if w != fa {63 spV[v] = true64 spV[w] = true65 }66 }67 }68 f(0, -1)69 70 spDis := make([][]int64, 0, len(spV))71 for v := range spV {72 dis := make([]int64, n)73 for i := range dis {74 dis[i] = 1e1875 }76 dis[v] = 077 h := hp51{{v, 0}}78 for len(h) > 0 {79 vd := h.pop()80 v := vd.v81 if dis[v] < vd.dis {82 continue83 }84 for _, e := range g[v] {85 w := e.to86 if newD := dis[v] + int64(e.wt); newD < dis[w] {87 dis[w] = newD88 h.push(vd51{w, newD})89 }90 }91 }92 spDis = append(spDis, dis)93 }94 95 for i := 0; i+1 < mx; i++ {96 for v := range pa {97 if p := pa[v][i]; p != -1 {98 pa[v][i+1] = pa[p][i]99 } else {100 pa[v][i+1] = -1101 }102 }103 }104 uptoDep := func(v, d int) int {105 for i := 0; i < mx; i++ {106 if (dep[v]-d)>>i&1 > 0 {107 v = pa[v][i]108 }109 }110 return v111 }112 _lca := func(v, w int) int {113 if dep[v] > dep[w] {114 v, w = w, v115 }116 w = uptoDep(w, dep[v])117 if w == v {118 return v119 }120 for i := mx - 1; i >= 0; i-- {121 if pv, pw := pa[v][i], pa[w][i]; pv != pw {122 v, w = pv, pw123 }124 }125 return pa[v][0]126 }127 for Fscan(in, &q); q > 0; q-- {128 Fscan(in, &v, &w)129 v--130 w--131 d := dep2[v] + dep2[w] - dep2[_lca(v, w)]*2132 for _, dis := range spDis {133 d = min(d, dis[v]+dis[w])134 }135 Fprintln(out, d)136 }137}138 139140