菊厂20250416软件机考T2解答(200分)

题目

已知某市运营了N条地铁线路,市民在乘坐地铁时单条线路通票2元,换乘一次加1元。给出N条线路的所有站名列表,请帮乘客寻找从出发站到目的站最便宜的地铁换乘方案,并输出票价。每条地铁线路不包含环路,即没有相同站名。

输入:

第一行为地铁线路条数N,范围是1, 1000

第二行到第N+1行,每条线路依次包含的站名,每个站名包含的字符个数不超过100,站点个数也不超过100,依次用空格隔开,不同线路中相同的站点名表示是一个换乘站

第N+2行,出发站和目的站,用空格隔开

输入保证:若可达则为唯一解

输出:

第一行按出发站-换乘站(可以是多个)-目的站的格式输出换乘方案的字符串

第二行输出换乘方案的总票价

如果没有任何方案实现出发站到目的站,只输出一行:NA

样例:

输入:

python 复制代码
3
A B C D F
C E G H 
B G I J
A J

输出:

python 复制代码
A-B-J
3

解释:一号线有A,B,C,D,F五个站点,二号线有C,E,G,H四个站点,三号线有B,G,I,J四个站点。从A站到J站的最省钱换乘路线是经B站换乘,票价3元

代码

思路:输入处理------站点与线路建立映射------直接到达检查------邻接表构建------BFS------路径回溯与打印输出

python 复制代码
from collections import defaultdict, deque
# If you need to import additional packages or classes, please import here.

def func():
    N = int(input())
    lines = []
    for i in range(N):
        line = list(map(str, input().split()))
        lines.append(line)
    start, end = list(map(str, input().split()))
    
    station_to_lines = defaultdict(list)
    for line_idx, stations in enumerate(lines):
        for s in stations:
            station_to_lines[s].append(line_idx)
    
    found_direct = False
    for line_idx in station_to_lines[start]:
        if end in lines[line_idx]:
            print(f"{start}-{end}")
            print(2)
            exit()
    
    adj_with_s = defaultdict(list)
    for s in station_to_lines:
        line_list = station_to_lines[s]
        for i in range(len(line_list)):
            for j in range(i + 1, len(line_list)):
                l1 = line_list[i]
                l2 = line_list[j]
                adj_with_s[l1].append((l2, s))
                adj_with_s[l2].append((l1, s))
    
    start_lines = station_to_lines[start]
    end_lines = set(station_to_lines[end])
    dist = [-1] * N
    prev = {}
    q = deque()
    
    for line in start_lines:
        dist[line] = 0
        q.append(line)
        
    target_line = -1
    found = False
   
    while q:
        current_line = q.popleft()
        if current_line in end_lines:
            target_line = current_line
            found = True
            break
        for neighbor_line, s in adj_with_s.get(current_line, []):
            if dist[neighbor_line] == -1 or dist[current_line] + 1 < dist[neighbor_line]:
                dist[neighbor_line] = dist[current_line] + 1
                prev[neighbor_line] = (current_line, s)
                q.append(neighbor_line)
    
    if not found:
        print("NA")
        exit()
    else:
        path = []
        current_line = target_line
        while current_line in prev:
            current_line, s = prev[current_line]
            path.append(s)
        path.reverse()
        res_path = start
        for i in range(len(path)):
            res_path = res_path + '-' + path[i]
        res_path = res_path + '-' + end
        print(res_path)
        k = len(path)
        cost = k + 2
        print(cost)
    # please define the python3 input here. For example: a,b = map(int, input().strip().split())
    # please finish the function body here.
    # please define the python3 output here. For example: print().

if __name__ == "__main__":
    func()
相关推荐
find1star2 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing2 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21122 小时前
力扣160 21 86
算法·leetcode·职场和发展
benchmark_cc3 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
小智老师PMP4 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN4 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218314 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
2601_962382434 小时前
python快乐编程网络爬虫课后答案
python·网络爬虫·学习工具·课后答案·刷题app
鹏哥带你干乡墅5 小时前
优选乡墅赋能培训平台如何帮助提升乡村建设?
大数据·人工智能·python
江畔柳前堤5 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native