最短路径问题,Dijkstra算法秒了
import heapq
# 路径信息,每个元素格式为(起点, 终点, 长度, 标记)
edges = [
(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}")
]
# 构建图
graph = {}
for edge in edges:
start, end, length, label = edge
if start not in graph:
graph[start] = []
if end not in graph:
graph[end] = []
graph[start].append((end, length, label))
graph[end].append((start, length, label)) # 因为是无向图,也要加入反向边
# Dijkstra算法找到最短路径
def dijkstra(graph, start, end):
queue = [(0, start, "")] # (距离,节点,路径上的标记)
visited = set()
while queue:
(dist, current, path) = heapq.heappop(queue)
if current in visited:
continue
visited.add(current)
if current == end:
return path
for neighbor, d, label in graph[current]:
if neighbor not in visited:
heapq.heappush(queue, (dist + d, neighbor, path + label))
return None
# 找到从地点1到地点26的最短路径上的标记
path_label = dijkstra(graph, 1, 26)
print(path_label)
得到flag:flag{WEIVKASJVLSJCHFSJVHJSDEV}