# -*- 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