buuctf 救世捷径【dijkstra算法】【单源最短路径算法】

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}

max=2000
graph=[[max] * 27 for _ in range(27)]

#读取节点信息
f=open('dj.txt','r').readlines()

#存入列表
for x in f:
    a,b,c,d=x.strip().split(' ')
    graph[int(a)][int(b)]=int(c)
    graph[int(b)][int(a)]=int(c)


temp1=[True for a in range(27)]
zuixiao=[0 for _ in range(27)]#每个点距离源点的最短距离
biaoji=[0 for _ in range(27)]

biaoji[0]=1
biaoji[1]=1
# init 初始化第一轮计算内容
for each in range(2,27):
    zuixiao[each]=graph[each][1]


for i in range(26):
    # 检查单前轮列表内容,查找最小并标记
    max=2000
    for each in range(2,27):
        
        if biaoji[each]==0 and zuixiao[each]<max:
            max=zuixiao[each]
            pos=each
    biaoji[pos]=1
    
    #如果有松弛,则更新松弛后的结果
    #如有有松弛,对于每个点而言,在当前轮中有且只有一次
    for j in range(2,27):
        if zuixiao[pos]+graph[pos][j]<zuixiao[j]:
            zuixiao[j]=zuixiao[pos]+graph[pos][j]
            temp1[j]=pos

print('zuixiao:',zuixiao)

print('temp1:',temp1)

y=26
route=[]
while y!=1:
    print('this way',y)#这里输出路径
    route.append(y)
    y=temp1[y]
route.append(1)
print(route)



for x in f:
    a,b,c,d=x.strip().split(' ')
    graph[int(a)][int(b)]=d
    graph[int(b)][int(a)]=d


for each in range(len(route)-1,0,-1):
    a,b=route[each],route[each-1]
    print(graph[a][b],end='')


# [26, 25, 22, 12, 5, 2, 1]
# FLAG{WEIVKASJVLSJCHFSJVHJSDEV}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值