Dijkstra算法的粗略学习

# -*- coding: utf-8 -*-
#########################################################################
# Author: Yao Kun
# Created Time: 5/6/2014 PM 3:51:35
# File Name: dijkstra.py
# Description: 
#########################################################################
print "dijkstra"
INFINITE = 10000
# 打印邻接矩阵
def print_adj(adj):
    # 用于按行输出的临时string变量
    print "adj matrix --> "
    for row in adj:
        str_row = ""
        for ele in row:
            str_row += str(ele) + "\t"
        print str_row, "\n"
# 找到指定下标集合的最小值
def find_min(lst, allow_lst):
    tmp_min = INFINITE
    index = -1
    for i in range(0, len(lst)):
        if lst[i] < tmp_min and allow_lst[i] != 0:
            tmp_min = lst[i]
            index = i
    return index
# ori代表初始源点
def dijkstra(S, D, adj, dist, ori, point_num):
    print "Core Alg"
    
    # 这样表示的更容易理解
    path = []
    # 初始化D集合和dist集合,dist集合记录到某点的最小距离
    for i in range(0, point_num):
        if i == ori:
            dist.append(0)
        else:
            dist.append(INFINITE)
        path.append([ori])
        D.append(-1)
    # print "dist :", dist
    # print "D :", D
    # 一直循环直到S集合满
    while len(S) < point_num:
        # u代表当前正准备处理的顶点,取得最小值,然后并把这个点从D集合中取出
        u = find_min(dist, D)
        D[u] = 0
        # 添加u点到S集中
        S.append(u)
        for v in range(0, point_num):
            if adj[u][v] != INFINITE and D[v] != 0:
                # Relax 步骤
                if(dist[v] > dist[u] + adj[u][v]):
                    dist[v] = dist[u] + adj[u][v]
                    # 记录路径,删除原来的路径,将到u的路径和点v假如到新的路径中
                    path[v] = []
                    for i in range(0, len(path[u])):
                        path[v].append(path[u][i])
                    
                    path[v].append(v)
                   
    return path
# 单源点集合
S = []
D = []
# 保存到各个顶点距离的最小长度
dist = []
# 邻接矩阵
adj = [
    [INFINITE,    10,           INFINITE,       30,             100],
    [INFINITE,    INFINITE,     50,             INFINITE,       INFINITE],
    [INFINITE,    INFINITE,     INFINITE,       INFINITE,       10],
    [INFINITE,    INFINITE,     20,             INFINITE,       60],
    [INFINITE,    INFINITE,     INFINITE,       INFINITE,       INFINITE]
]
print_adj(adj)
path = dijkstra(S, D, adj, dist, 1, 5)
print path


转载于:https://my.oschina.net/hope1ove/blog/274410

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值