最短路径算法(Dijkstra, Bellman-Ford, Floyd-Warshall)-python实现

Dijkstra:

Inf = float('inf')

Adjacent = [[0, 1, 12, Inf, Inf, Inf],
            [Inf, 0, 9, 3, Inf, Inf],
            [Inf, Inf, 0, Inf, 5, Inf],
            [Inf, Inf, 4, 0, 13, 15],
            [Inf, Inf, Inf, Inf, 0, 4],
            [Inf, Inf, Inf, Inf, Inf, 0]]

src, dst, N = 0, 5, 6

def dijstra(adj, src, dst, n):
    dist = [Inf] * n
    dist[src] = 0
    book = [0] * n
    u = src
    for _ in range(n-1):
        book[u] = 1
        next_u, minVal = None, float('inf')
        for v in range(n):
            if not book[v] and adj[u][v] + dist[u] < dist[v]:
                dist[v] = adj[u][v] + dist[u]
                if dist[v] < minVal:
                    next_u, minVal = v, dist[v]
        u = next_u
    return dist

print(dijstra(Adjacent, src, dst, N))

Bellman-Ford:

INF = float('inf')

def Bellman_Ford(Graph, start, n):
    
    D = [INF] * n
    Pr = [-1] * n
    D[start] = 0

    # 初始化结束, 开始循环
    for _ in range(0,n-1):
        for k in range(n):
            for j in range(n):
                if(D[k] > D[j] + Graph[j][k]):
                    D[k] = D[j] + Graph[j][k]
                    Pr[k] = j
    return D

Graph = [[0, 1, 5, 3, INF],
         [INF, 0, 2, INF, INF],
         [INF, INF, 0, -4, INF],
         [INF, INF, INF, 0, 3],
         [INF, 2, INF, INF, 0]]

print(Bellman_Ford(Graph, 0, 5))

Floyd-Warshall:

INF = float('inf')

Graph = [
    [0, 2, 6, 4],
    [INF, 0, 3, INF],
    [7, INF, 0, 1],
    [5, INF, 12, 0]
]

def floyd(Graph, n):
    for k in range(n):
        for i in range(n):
            for j in range(n):
                if Graph[i][j] > Graph[i][k] + Graph[k][j]:
                    Graph[i][j] = Graph[i][k] + Graph[k][j]
    return Graph

print(floyd(Graph, 4))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值