Dijkstra算法的粗略学习
Dijkstra算法的粗略学习
syaokun219 发表于4年前
Dijkstra算法的粗略学习
  • 发表于 4年前
  • 阅读 149
  • 收藏 6
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 今天看到了之前自己写的PHP的最短路算法,好啰嗦,虽然这次python的也没好到哪里去,但希望还是能好好学习一下
# -*- 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


共有 人打赏支持
粉丝 2
博文 4
码字总数 3017
×
syaokun219
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: