ctf - Dijkstra

在進行數據處理的時候,學習了多維字典增加元素的方法。
對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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章