地铁的最短路径

项目介绍:
提供一副地铁线路图,计算指定两站之间最短(最少经过站数)乘车路线;输出指定地铁线路的所有站点。以北京地铁为例,地铁线路信息保存在data.txt中,格式如下:
地铁线路总数
线路名1 站名1 站名2 站名3 ...
线路名2 站名1 站名2 站名3 ...
线路名3 站名1 站名2 站名3 ......
1.需求分析
功能需求:根据用户输入的起点和终点,程序经过运算能得出两站之间最短路径,并打印出最短路径经过的站点。
性能需求:地铁站点为一个城市的所有地铁站点,能在1秒内计算出最短路径。
接口需求:地铁路线数据使用文本存储,读入数据接口需要能读取并处理txt文件。
2.实现语言
python
3.实现算法
dijkstra
4、类职责划分
读入文件,将txt信息记录在list队列里
file="C:\\Users\\青朽\Desktop\\地铁最短路径.txt"
"""
读入地铁信息文件,对数据进行处理
"""
data=dict()
with open(file, "rt", encoding="utf-8") as file:
n=int(file.readline())
for i in range(n):
value=""
line=file.readline().split()
for i in line[1:]:
value=value+i+" "
data[line[0]]=value
list=data
数据处理,将传入的数据为每个地铁站建立与之相邻的邻接表
def build_subway(**lines):
for key in lines.keys():
value = lines[key]
lines[key] = value.split()
stations = set()
for key in lines.keys():
stations.update(set(lines[key]))
system = {}
for station in stations:
next_station = {}
for key in lines:
if station in lines[key]:
line = lines[key]
idx = line.index(station)
if idx == 0:
next_station[line[1]] = key
elif idx == len(line) - 1:
next_station[line[idx - 1]] = key
else:
next_station[line[idx - 1]] = key
next_station[line[idx + 1]] = key
system[station] = next_station
return system
打印出邻接表,可以判断数据处理是否正确
sub=build_subway(**list)
for i in sub:
print(i,sub[i])

main函数与用户进行交互,通过用户输入选择处理方式
def main():
flag = input("请输入您要查询的功能(a.查询路线站点 b.查询两站之间最短路径)")
if flag == "a":
path = input("请输入您要查询的路线名:")
print(list[path])
elif flag=="b":
start = input("请输入起始站:")
end = input("请输入终点站:")
print(shorter_path(start, end))
else:
print("请输入正确查询")
5、核心代码
运用BFS算法,通过起始站终点站查询最短路径
def shorter_path(start, goal):
if start == goal:
return [start]
explored = set()
queue = [ [start] ]
while queue:
path = queue.pop(0)
s = path[-1]
for state, action in sub[s].items():
if state not in explored:
explored.add(state)
path2 = path + [action, state]
if state == goal:
return path2
else:
queue.append(path2)
return []
6、测试用例
查询路线站点

查询两站之间最短路径

输入错误报错

7、代码托管
完整代码已上传至github
https://github.com/15005885245/Subway
8、总结
1).第一次接触到了自己写博客,学会一个新技能
2).查看了很多相关博客,发现python对有些项目解法很便捷
3).重新复习了BFS算法,有了更深入的了解

浙公网安备 33010602011771号