在进行数据处理的时候,学习了多维字典增加元素的方法。
对https://www.jb51.net/article/130370.htm 的算法做了一些修改。
# coding:utf-8
source='''
1 2 100 FLAG{
2 3 87 AFQWE
2 4 57 ETKLS
2 5 50 WEIVK
2 6 51 AWEIW
3 7 94 QIECJF
3 8 78 QSXKE
3 9 85 QWEIH
4 13 54 WQOJF
4 14 47 KDNVE
4 15 98 QISNV
5 10 43 AEWJV
5 11 32 QWKXF
5 12 44 ASJVL
6 16 59 ASJXJ
6 17 92 QJXNV
6 18 39 SCJJF
6 23 99 SJVHF
7 19 99 WJCNF
8 20 96 SKCNG
9 20 86 SJXHF
10 21 60 SJJCH
11 21 57 SJHGG
12 22 47 SJCHF
14 10 55 EJFHG
16 17 59 ASJVH
18 12 53 SJFHG
18 24 93 SHFVG
21 22 33 SJFHB
19 25 88 ASHHF
20 25 96 SJVHG
22 25 23 SJVHJ
25 26 75 SDEV}
'''
d = source.split()
dic={}
for i in range(len(d)/4):#数据预处理
f1=i*4
f2=i*4+1
f3=i*4+2
f4=i*4+3
if int(d[f1]) not in dic:
dic.update({int(d[f1]):dict({int(d[f1]):[0,'']})})
if int(d[f2]) not in dic:
dic.update({int(d[f2]):dict({int(d[f2]):[0,'']})})
dic[int(d[f1])][int(d[f2])]=[int(d[f3]),d[f4]]
#print dic
def Dijkstra(G,v0,INF=999):
book = set()
minv = v0
# 源顶点到其余各顶点的初始路程
dis = dict((k,[INF,'']) for k in G.keys())
dis[v0] = [0,'']
while len(book)<len(G):
#print book
book.add(minv) # 确定当期顶点的距离
#print G[minv]
for w in G[minv]: # 以当前点的中心向外扩散
#print minv,w
#print dis
if dis[minv][0] + G[minv][w][0] < dis[w][0]: # 如果从当前点扩展到某一点的距离小与已知最短距离
dis[w][0] = dis[minv][0] + G[minv][w][0] # 对已知距离进行更新
dis[w][1] = dis[minv][1] + G[minv][w][1] # 对相应字符串进行增长
new = INF # 从剩下的未确定点中选择最小距离点作为新的扩散点
for v in dis.keys():
if v in book: continue
if dis[v][0] < new:
new = dis[v][0]
minv = v
return dis
dis = Dijkstra(dic,v0=1)
print dis.values()
本文介绍了一种使用多维字典处理数据的方法,并通过修改算法,实现了Dijkstra算法的应用。通过对数据进行预处理,将数据转换为多维字典结构,然后运用Dijkstra算法计算最短路径。

被折叠的 条评论
为什么被折叠?



