求圖中兩點最短路徑(dijkstra) go實現

import (
	"testing"
	"strconv"
	"fmt"
)

// V - S = T
type Dijkstra struct {
	Visit bool   // 表示是否訪問
	Val   int    // 表示距離
	Path  string // 路徑的顯示
}

const (
	INT_MAX = 1<<32 - 1
)

func getShortPathByDijkstra(begin int, vertex [][]int) []Dijkstra {
	if 0 == len(vertex) || 0 == len(vertex[0]) || len(vertex) != len(vertex[0]) {
		return []Dijkstra{}
	}
	d := make([]Dijkstra, len(vertex))

	for i := 0; i < len(vertex); i++ {
		d[i].Visit = false
		d[i].Val = vertex[begin-1][i]
		d[i].Path = "V" + strconv.Itoa(begin) + " -> V" + strconv.Itoa(i+1)
	}

	d[begin-1].Visit = true
	d[begin-1].Val = 0
	count := 1
	for count < len(vertex) { // 從源點到目的點依次加入最短路徑節點進去
		min := INT_MAX
		temp := 0
		for i := 0; i < len(vertex); i++ { // 找源點到集合T中最短路徑的點加入到S中
			if !d[i].Visit && d[i].Val < min {
				min = d[i].Val
				temp = i
			}
		}
		d[temp].Visit = true
		for i := 0; i < len(vertex); i++ { // 進行鬆弛,即更新源點到各節點的最短路徑

			if !d[i].Visit && vertex[temp][i] != INT_MAX && d[temp].Val + vertex[temp][i] < d[i].Val {
				d[i].Val = d[temp].Val + vertex[temp][i]
				d[i].Path = d[temp].Path + " -> V" +  strconv.Itoa(i+1)
			}
		}
		count ++
	}

	return d
}

func TestDij(t *testing.T) {
	var vertex [][]int
	for i := 0; i < 6; i++ {
		tmp := make([]int, 6)
		vertex = append(vertex, tmp)
	}
	for i := 0; i < 6; i++ {
		for j:=0;j <6; j++ {
			vertex[i][j] = INT_MAX
		}
	}
	vertex[0][2] = 10
	vertex[0][4] = 30
	vertex[0][5] = 100
	vertex[1][2] = 5
	vertex[2][3] = 50
	vertex[3][5] = 10
	vertex[4][5] = 60
	vertex[4][3] = 20
	d := getShortPathByDijkstra(1, vertex)
	fmt.Println(d[5])
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章