python编写dijkstra算法

'''
示例结果:
init
[1, 0, 0, 0, 0, 0] [0, 30, 15, 1000, 1000, 1000] [0, 0, 0, 0, 0, 0]
process
[1, 1, 1, 1, 1, 1] [0, 25, 15, 50, 40, 30] [2, 1, 5, 4, 3, 0]
'''

MAX_NUM = 1000
v_len = 6                       #顶点数
S = [0 for i in range(v_len)]   #作为mark容器,检验顶点是否已经被添加
path = S[:]         #存储添加顶点过程
dist = []           #放置到每个顶点的最短长度

'''邻接矩阵'''
edge = [
    [0,30,15,MAX_NUM,MAX_NUM,MAX_NUM],
    [5,0,MAX_NUM,MAX_NUM,20,30],
    [MAX_NUM,10,0,MAX_NUM,MAX_NUM,15],
    [MAX_NUM,MAX_NUM,MAX_NUM,0,MAX_NUM,MAX_NUM],
    [MAX_NUM,MAX_NUM,MAX_NUM,10,0,MAX_NUM],
    [MAX_NUM,MAX_NUM,MAX_NUM,30,10,0]
    ]

def init(start):
    for i in range(0,v_len):
        dist.append(edge[start][i])
    dist[start] = 0
    S[start] = 1
    path[0] = start
    print 'init\n',S,dist,path      #初始化结果显示

def find_min():                     #开始处理
    print 'process'
    u = 0
    for i in range(0,v_len-1):
        mini = MAX_NUM
        for j in range(0,v_len):
            if(not S[j] and dist[j]<mini):
                u = j
                mini = dist[j]
        S[u] = 1
        path[i] = u
        for k in range(0,v_len):
            if(not S[k] and edge[u][k]<MAX_NUM and dist[u]+edge[u][k]<dist[k]):
                dist[k] = dist[u] + edge[u][k]
    print S,dist,path;              #显示结果

def py_dijkstra(start):
    init(start)
    find_min()

if(__name__=="__main__"):
    py_dijkstra(0)                 #以0为源点        
                




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值