求图中两点最短路径(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])
}

 

你可能感兴趣的:(算法)