알고리즘/이것이 코딩테스트다
15_특정 거리의 도시 찾기
happenundo
2024. 2. 1. 17:00
728x90
18352번: 특정 거리의 도시 찾기
첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개
www.acmicpc.net
BFS 문제다.
문제에서 모든 도로의 거리는 1이라고 했으니, 모든 간선의 비용이 1인 것이다.
이럴 때는 BFS를 활용해서 최단 거리를 구할 수 있다.(간선의 비용이 다른 경우에는 다익스트라)
노드의 개수 N은 300,000 이하이고, 간선의 개수 M은 1,000,000 이하이므로,
시간 복잡도는 O(N+M)에 의해 완전완전 가능하다.
기초적인 BFS 구현을 통해 풀 수 있는 문제다.
풀이 코드
# 18352번: 특정 거리의 도시 찾기
from collections import deque
import sys
input = sys.stdin.readline
n, m, k, x = map(int ,input().split())
graph = [[] for _ in range(n+1)]
visited = [0] * (n+1) # 방문 여부를 저장하는 리스트(0이면 방문x, 나머지는 방문까지의 거리)
for _ in range(m):
a, b = map(int, input().split())
graph[a].append(b)
def bfs():
queue = deque([x]) # 시작점을 큐에 넣고 시작
visited[x] = 1 # 시작 점을 방문 처리
while queue:
now = queue.popleft()
for i in graph[now]:
if visited[i] == 0:
queue.append(i)
visited[i] = visited[now] + 1
# visited 배열에 저장된 수들은 시작점에서의 최단거리 + 1인 값임
# 그러므로 k+1을 확인해야 함
answer = []
for i in range(1, n+1):
if visited[i] == k+1:
answer.append(i)
return answer
result = bfs()
if len(result) == 0:
print(-1)
else:
for num in result:
print(num)
정답 로직 출력부분을 약간 수정해 이런식으로 하면 더 깔끔하게 답을 구할 수 있다.
...
def bfs():
queue = deque([x]) # 시작점을 큐에 넣고 시작
visited[x] = 1 # 시작 점을 방문 처리
while queue:
now = queue.popleft()
for i in graph[now]:
if visited[i] == 0:
queue.append(i)
visited[i] = visited[now] + 1
bfs()
check = False
for i in range(1, n+1):
# visited 배열에 저장된 수들은 시작점에서의 최단거리 + 1인 값임
# 그러므로 k+1을 확인해야 함
if visited[i] == k+1:
print(i)
check = True
if not check:
print(-1)
728x90