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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值