|  | @@ -25,14 +25,19 @@ func main() {
 | 
	
		
			
				|  |  |  	fmt.Println(prev)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -type minHeap [][2]int
 | 
	
		
			
				|  |  | +type pair struct {
 | 
	
		
			
				|  |  | +	k int
 | 
	
		
			
				|  |  | +	w int
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +type minHeap []pair
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (h minHeap) Len() int           { return len(h) }
 | 
	
		
			
				|  |  | -func (h minHeap) Less(i, j int) bool { return h[i][0] < h[j][0] }
 | 
	
		
			
				|  |  | +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.([2]int))
 | 
	
		
			
				|  |  | +	*h = append(*h, x.(pair))
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (h *minHeap) Pop() interface{} {
 | 
	
	
		
			
				|  | @@ -46,24 +51,26 @@ 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, [2]int{0, src})
 | 
	
		
			
				|  |  | +	heap.Push(&mh, pair{src, 0})
 | 
	
		
			
				|  |  |  	for mh.Len() != 0 {
 | 
	
		
			
				|  |  | -		u := heap.Pop(&mh).([2]int)
 | 
	
		
			
				|  |  | -		if dist[u[1]] < u[0] {
 | 
	
		
			
				|  |  | +		u := heap.Pop(&mh).(pair)
 | 
	
		
			
				|  |  | +		if used[u.k] {
 | 
	
		
			
				|  |  |  			continue
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | -		for _, v := range adj[u[1]] {
 | 
	
		
			
				|  |  | -			alt := u[0] + length[u[1]][v]
 | 
	
		
			
				|  |  | +		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[1]
 | 
	
		
			
				|  |  | -				heap.Push(&mh, [2]int{alt, v})
 | 
	
		
			
				|  |  | +				prev[v] = u.k
 | 
	
		
			
				|  |  | +				heap.Push(&mh, pair{v, alt})
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 |