地铁的最短路径


项目介绍:
提供一副地铁线路图,计算指定两站之间最短(最少经过站数)乘车路线;输出指定地铁线路的所有站点。以北京地铁为例,地铁线路信息保存在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算法,有了更深入的了解

posted @ 2020-10-21 16:17  1i  阅读(608)  评论(2)    收藏  举报