在进行数据处理的时候,学习了多维字典增加元素的方法。
对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()