Dijkstra算法-python版本

以下代码中的图可以是手动输入,或者直接使用定义好的。手动输入的,需输入点的数目n,以及边的数目m,以及直接点之间的权重。
总体思路,每次找出当前图中距离源点1最近的点k,计算源点1经过该点k到达某个点j是否比原来更近,如果更近,则把源点1到某个点j的距离,替换为这个更近的距离。经过n-1次查找(把除了源点之外的点都遍历一遍,每个点都当一次中介值),即可得出源点到每个点最近的距离。


#目的是要求出源点1到其他各个点时间的最小路径距离
MAX = 9999999999
#n, m = map(int, input('输入n个点和m条边:').split())
#g = [[MAX] * (n + 1) for i in range(n + 1)]
n = 5 #五个点
m = 7 #七条边
g= [
    [MAX, MAX, MAX, MAX, MAX, MAX],
    [MAX, 0, 10, MAX, 30, 100],
    [MAX, MAX, 0, 50, MAX, MAX],
    [MAX, MAX, MAX, 0, MAX, 10],
    [MAX, MAX, MAX, 20, 0, 60],
    [MAX, MAX, MAX, MAX, MAX, MAX]
]
d = [MAX] * (n + 1)
visitd = [0] * (n + 1) #记录该点是否为访问过
'''
#输入各个点之间的距离
for i in range(m):
    a, b, v = map(int, input().split())
    g[a][b] = v
'''
#初始化源点到各个点的距离
d[1] = 0
for i in range(2, n + 1):
    d[i] = g[1][i]

visitd[1] = 1
for i in range(2, n + 1):
    min = MAX
    for j in range(2, n + 1):
        if d[j] < min and visitd[j] == 0:
            min = d[j]
            k = j
    visitd[k] = 1#表示k是当前距1最短的点,同时标记k已经被找过
    for j in range(2, n + 1):
        if d[j] > d[k] + g[k][j] and visitd[j] == 0:
            d[j] = d[k] + g[k][j]

for i in range(1, n + 1):
    print(d[i])
发布了49 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/figo8875/article/details/91044056