首页 > 编程语言 > 详细

Python实现迪杰斯特拉算法

时间:2020-07-20 01:03:44      阅读:128      评论:0      收藏:0      [点我收藏+]

首先我采用邻接矩阵法来表示图(有向图无向图皆可)

图的定义如下:

class Graph:
    def __init__(self, arcs=[]):
        self.vexs = []
        self.arcs = arcs

    def creategrapg(self):
        self.vexs = input().split()
        for i in range(len(self.vexs)):
            self.arcs.append([float(inf) if int(v) == 0 else int(v)
                              for v in input().split()])

其中creategrapg用来创建图,创建图时,首先输入所有顶点,以空格分隔在一行内输入,后面为一个n*n的矩阵,n为顶点数目。

算法具体实现如下:

    def ShortestPath_DIJ(self, v):
        #迪杰斯特拉算法
        v0 = self.vexs.index(v)
        n = len(self.vexs)
        S = [False] * n
        S[v0] = True
        D = self.arcs[v0].copy()
        Path = [-1] * n
        for i in range(n):
            if D[i] < float(inf):
                Path[i] = v0
        D[v0] = 0
        for i in range(1, n):
            min_ = float(inf)
            for w in range(n):
                if not S[w] and D[w] < min_:
                    v_ = w
                    min_ = D[w]
            S[v_] = True
            for w in range(n):
                if not S[w] and (D[v_] + self.arcs[v_][w] < D[w]):
                    D[w] = D[v_] + self.arcs[v_][w]
                    Path[w] = v_
        print(f从{v}到各顶点的最短路径为:)
        # 算法到此其实已经结束,下面我自己写的用来展示路径的部分
        for ind, val in enumerate(Path):
            if ind == v0:
                continue
            if val == -1:
                print(f{self.vexs[ind]}:不可到达)
                continue
            path_ = [self.vexs[ind]]
            while val > 0:
                path_.append(self.vexs[val])
                val = Path[val]
            # path_.append(v)
            print(self.vexs[ind] + : + ->.join(path_[::-1]))

注:这个函数实际上是写在Graph类里面的,为了方便叙述我才分开放了代码。

运行代码:

mygraph = Graph()
mygraph.creategrapg()
mygraph.ShortestPath_DIJ(mygraph.vexs[1])

输入的图如下图所示。

输入样例为:

v0 v1 v2 v3 v4 v5
0 0 10 0 30 100
0 0 5 0 0 0 
0 0 0 50 0 0 
0 0 0 20 0 10
0 0 0 0 0 60
0 0 0 0 0 0

技术分享图片

运行结果如下:

从v1到各顶点的最短路径为:
v0:不可到达
v2:v1->v2
v3:v1->v2->v3
v4:不可到达
v5:v1->v2->v3->v5

 

Python实现迪杰斯特拉算法

原文:https://www.cnblogs.com/qgqb/p/13341887.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!