地铁线路最短路径问题

项目介绍:

以北京地铁为例,计算两个站点之间的最短路径(站数最少)并输出指定路线的所有站点。地铁线路信息放在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.希望以后能多看博客多学习

 

posted @ 2020-10-22 12:02  31801307  阅读(311)  评论(0)    收藏  举报