快递投放问题
题目描述
有 N 个快递站点,使用字符串标识。某些站点之间存在道路连接。每个站点有一些包裹需要运输,站点间的包裹不重复。路上设有检查站,可能导致部分货物无法通行。请计算哪些货物无法正常投递。
输入描述
- 第一行输入 M N,表示 M 个包裹和 N 条道路信息。
- 0 <= M, N <= 100。
- 后续包含包裹信息及道路连接信息。
- 检查站禁止通行的包裹如果有多个以空格分开。
输出描述
- 输出不能送达的包裹,如:package2 package4。
- 如果所有包裹都可以送达则输出:none。
- 输出结果按照升序排列。
解题思路
本题本质上是图论中的连通性问题。可以将站点视为图的节点,道路视为边。对于每一个包裹,需要判断其起点到终点是否存在路径。
- 建图:根据输入的 N 条道路信息构建无向图(或邻接表)。
- 遍历:对每个包裹的起点进行广度优先搜索(BFS)或深度优先搜索(DFS),查找是否能到达终点。
- 统计:记录无法到达终点的包裹 ID。
- 排序输出:将结果按字典序或数字顺序排序后输出。
代码实现
Python 实现
from collections import deque
def solve():
try:
line1 = input().split()
if not line1: return
m, n = int(line1[0]), int(line1[1])
packages = []
for _ in range(m):
parts = input().split()
# 假设格式为:PackageID Source Dest
if len(parts) >= 3:
packages.append((parts[0], parts[1], parts[2]))
graph = {}
for _ in range(n):
u, v = input().split()
u graph: graph[u] = ()
v graph: graph[v] = ()
graph[u].add(v)
graph[v].add(u)
undeliverable = []
():
start == end:
queue = deque([start])
visited = {start}
queue:
curr = queue.popleft()
curr graph:
neighbor graph[curr]:
neighbor == end:
neighbor visited:
visited.add(neighbor)
queue.append(neighbor)
pkg_id, src, dst packages:
bfs(src, dst):
undeliverable.append(pkg_id)
undeliverable:
()
:
(.join((undeliverable)))
Exception:
__name__ == :
solve()


