经典算法(三)最短路径

#!/bin/python
# -*- coding:utf-8 -*-

def dijkstra(graph, startIndex, path, cost, max):
    m = len(graph)
    visited = [0] * m
    # 初始化
    for i in range(m):
        if i == startIndex:
            visited[i] = 1
        else:
            if graph[startIndex][i] < max:
                cost[i] = graph[startIndex][i]
                path[i] = startIndex
            else:
                cost[i] = max
                path[i] = -1
    # 每次更新一个,需要m-1次
    for i in range(1, m):
        curIndex = -1
        minCost = max
        # 找到最小的
        for j in range(m):
            if visited[j]==0 and cost[j] < minCost:
                minCost = cost[j]
                curIndex = j
        # 均不可达,跳出循环
        if curIndex == -1:
            break
        visited[curIndex] = 1
        # 更新其他
        for j in range(m):
            if visited[j]==0 and cost[j] > cost[curIndex] + graph[curIndex][j]:
                cost[j] = cost[curIndex] + graph[curIndex][j]
                path[j] = curIndex
    return cost, path


if __name__ == '__main__':
    max = 2147483647
    graph = [
        [max, max, 10, max, 30, 100],
        [max, max, 5, max, max, max],
        [max, max, max, 50, max, max],
        [max, max, max, max, max, 10],
        [max, max, max, 20, max, 60],
        [max, max, max, max, max, max],
        ]
    path = [0] * 6
    cost = [0] * 6
    print dijkstra(graph, 0, path
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值