算法笔记:Dijkstra算法

迪杰斯特拉算法的核心在于,我们标记的“已访问”的节点,是已经通过多次探索权值最小项来确定好了到该节点的加权路径已经是确定的最小值了,所以可以通过本次“已访问”的节点来去继续访问其他节点而不用去担心产生因为已访问的节点值改变而产生其他节点的值变化,因为以访问的节点的值已经固定最小了。

代码实现:
package main

import "fmt"

const MAXVEX int = 9
const MAXWEIGHT int = 1000

func NewGraph() [MAXVEX][MAXVEX]int {
    var graph [MAXVEX][MAXVEX]int
    var v0 = [MAXVEX]int{0, 1, 5, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT}
    var v1 = [MAXVEX]int{1, 0, 3, 7, 5, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT}
    var v2 = [MAXVEX]int{5, 3, 0, MAXWEIGHT, 1, 7, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT}
    var v3 = [MAXVEX]int{MAXWEIGHT, 7, MAXWEIGHT, 0, 2, MAXWEIGHT, 3, MAXWEIGHT, MAXWEIGHT}
    var v4 = [MAXVEX]int{MAXWEIGHT, 5, 1, 2, 0, 3, 6, 9, MAXWEIGHT}
    var v5 = [MAXVEX]int{MAXWEIGHT, MAXWEIGHT, 7, MAXWEIGHT, 3, 0, MAXWEIGHT, 5, MAXWEIGHT}
    var v6 = [MAXVEX]int{MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, 3, 6, MAXWEIGHT, 0, 2, 7}
    var v7 = [MAXVEX]int{MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, 9, 5, 2, 0, 4}
    var v8 = [MAXVEX]int{MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, 7, 4, 0}
    graph[0] = v0
    graph[1] = v1
    graph[2] = v2
    graph[3] = v3
    graph[4] = v4
    graph[5] = v5
    graph[6] = v6
    graph[7] = v7
    graph[8] = v8
    return graph
}

func Dijkstra(i int, j int, graph [MAXVEX][MAXVEX]int) int {
    var shortTablePath = [MAXVEX]int{MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT}
    i -= 1
    j -= 1
    var TablePathMin int       //未遍历的最小节点的值
    var Vx int                 //未遍历的最小节点的下标
    var isgetPath [MAXVEX]bool //记录节点是否已访问
    var MinPath [MAXVEX]int    //此点的上一节点
    var lastPath int           //上一节点
    for v := 0; v < MAXVEX; v++ {
        shortTablePath[v] = graph[i][v]
    }
    shortTablePath[i] = 0
    isgetPath[i] = true
    lastPath = i
    for v := 1; v < MAXVEX; v++ {
        TablePathMin = MAXWEIGHT
        for w := 0; w < MAXVEX; w++ { //找出未访问的最小节点
            if !isgetPath[w] && shortTablePath[w] < TablePathMin {
                Vx = w
                TablePathMin = shortTablePath[w]
            }
        }
        isgetPath[Vx] = true
        MinPath[Vx] = lastPath
        if Vx == j {
            Patht := Vx
            Path := []int{}
            for {
                Path = append(Path, MinPath[Patht])
                Patht = MinPath[Patht]
                if Patht == i {
                    break
                }
            }
            fmt.Println("最小路径为")
            for t := len(Path) - 1; t >= 0; t-- {
                fmt.Println(Path[t] + 1)
            }
            fmt.Println("最小值为  ", shortTablePath[Vx])
            return shortTablePath[Vx]
        }
        for j := 0; j < MAXVEX; j++ {
            if !isgetPath[j] && TablePathMin+graph[Vx][j] < shortTablePath[j] {
                shortTablePath[j] = TablePathMin + graph[Vx][j]
            }
        }
        lastPath = Vx
    }
    return MAXWEIGHT
}
func main() {
    graph := NewGraph()
    i := Dijkstra(1, 5, graph)
    fmt.Println(i)

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值