地铁线路最短路径问题
项目介绍:
以北京地铁为例,计算两个站点之间的最短路径(站数最少)并输出指定路线的所有站点。地铁线路信息放在data.txt中,数据格式如下:
地铁线路总数
线路名1 站名1 站名2 站名3 ...
线路名2 站名1 站名2 站名3 ...
线路名3 站名1 站名2 站名3 ...
...

需求分析:
1.根据出发站点和目的站点给出最短路径(站数最少)
2.根据用户的输入,给出指定路线的所有站点。
github:
https://github.com/993577028/subway
实现语言
python
实现算法
BFS
类职责划分(将相关类的功能进行描述)
read_data(file_name):读入对应的txt文件,并转换成字典存储
build_subway(**lines):将读入的文件转换成邻接表
shorter_path(start, goal):根据BFS算法算出最短路径
printinfo(start,end):按照指定格式输出指定两站点间的线路信息
核心代码(将所有类的代码标注并提交)
def read_data(file_name): data=dict() with open(file_name, "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 return data
def build_subway(**lines): for key in lines.keys(): #取出每条线路的所有站点,但此时还是整个字符串的状态 value = lines[key] #对整个字符穿进行分词处理,并更新字典line信息 lines[key] = value.split() #创建一个无序不重复元素集 stations = set() for key in lines.keys(): #取出所有站点进去去重处理并存放到stations中 stations.update(set(lines[key])) #创建一个空字典,用来存放邻接表 system = {} #遍历所有站点 for station in stations: #创建一个新的空字典用来存放站点的相邻站点信息,包括站点名和所属线路名 next_station = {} #遍历更新过的lines for key in lines: #判断站点是否在该线路中 if station in lines[key]: line = lines[key] #找出该站点在该线路的下标 idx = line.index(station) if idx == 0: #如果下标为零说明是起始站点,那么在该线路中的相邻站点就只有一个就是下标为1的站点,将其加入邻接表 next_station[line[1]] = key elif idx == len(line)-1: #如果下标为values值的长度-1说明是终点站,那么在该线路中的相邻站点就只有一个就是下标为values长度-2的站点,将其加入邻接表 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
def shorter_path(start, goal): #BFS算法 if start == goal: return [start] explored = set() queue = [ [start] ] while queue: path = queue.pop(0) s = path[-1] for state, action in bj_subway[s].items(): if state not in explored: explored.add(state) path2 = path + [action, state] if state == goal: return path2 else: queue.append(path2) return []
def printinfo(start,end): if start not in bj_subway.keys(): print("请输入正确的出发站点") return if end not in bj_subway.keys(): print("请输入正确的终点站") return path=shorter_path(start,end) if(len(path)==1): print(path[0]) return linename=path[1] print("请先乘坐",path[1]) for i in range(len(path)): if((i+1)%2==1): print(path[i]) else: if(linename!=path[i] and i!=1): print("------换乘",path[i],"-------") linename=path[i]
测试用例(将输入输出结果截图提交)
正常查询两站之间最短路径:

查询并输出指定地铁路线的所有站点:

输入错误的出发站点

输入错误的终点站

输入错误的地铁线路

源代码参考博客:https://blog.csdn.net/myjiayan/article/details/45954679
总结
1.第一次用博客来写记录自己写的代码,感觉还不错。
2.希望以后能多看博客多学习

浙公网安备 33010602011771号