题解:P11591 [NordicOI 2024] Anime Shops
DashZhanghanxu · · 题解
解析
如题,每个城市间有双向道路,所以我们可以使用无向带权图和搜索来解题。
用一个队列来实现图,并对这个图进行深度优先搜索,如果当前搜索的节点有动漫商店时,记录当前节点与起点城市的距离(即图之间的权值之和),与之前所记录的最小值进行比较,若该距离比之前所记录的最小值更小,则将最小值更新为当前距离,并返回上一个节点,进行搜索。最后输出最小值。
CODE
from collections import deque
def main():
n, m, k = map(int, input().split())
anime_cities = set(map(int, input().split()))
graph = {i: [] for i in range(1, n + 1)}
for _ in range(m):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
results = []
for start_city in range(1, n + 1):
queue = deque([(start_city, 0)])
visited = set([start_city])
found = False
min_distance = float('inf')
while queue:
current_city, distance = queue.popleft()
if current_city in anime_cities and current_city!= start_city:
min_distance = distance
found = True
break
for neighbor in graph[current_city]:
if neighbor not in visited:
visited.add(neighbor)
queue.append((neighbor, distance + 1))
if found:
results.append(min_distance)
else:
results.append(-1)
print(*results)
if __name__ == "__main__":
main()