문제
어떤 나라에는 1번부터 N번까지의 도시와 M개의 단방향 도로가 존재한다. 모든 도로의 거리는 1이다.
이 때 특정한 도시 X로부터 출발하여 도달할 수 있는 모든 도시 중에서, 최단 거리가 정확히 K인 모든 도시들의 번호를 출력하는 프로그램을 작성하시오. 또한 출발 도시 X에서 출발 도시 X로 가는 최단 거리는 항상 0이라고 가정한다.
예를 들어 N=4, K=2, X=1일 때 다음과 같이 그래프가 구성되어 있다고 가정하자.
이 때 1번 도시에서 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 2인 도시는 4번 도시 뿐이다. 2번과 3번 도시의 경우, 최단 거리가 1이기 때문에 출력하지 않는다.
입력
첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개의 자연수 A, B가 공백을 기준으로 구분되어 주어진다. 이는 A번 도시에서 B번 도시로 이동하는 단방향 도로가 존재한다는 의미다. (1 ≤ A, B ≤ N) 단, A와 B는 서로 다른 자연수이다.
출력
X로부터 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 K인 모든 도시의 번호를 한 줄에 하나씩 오름차순으로 출력한다.
이 때 도달할 수 있는 도시 중에서, 최단 거리가 K인 도시가 하나도 존재하지 않으면 -1을 출력한다.
풀이
- 최단 거리를 못 보고 깊이 탐색으로 구현했는데 깊이 탐색은 가장 깊은 곳으로 가기 때문에 절대로 최단 거리를 구할 수 없다
- 다음은 오류 코드이다.
# 특정거리의 도시 찾기
# 1~ n
# 끝까지 확인해야 하므로 DFS
# X도시에서 갈 수 있는 도착지를 모두 확인
# 확인 시 카운트..
# 입력
n, m, k, x = map(int, input().split())
unlist = [ list(map(int, input().split())) for _ in range(m)]
graphs = [[] for i in range(n + 1)]
graphs[0] = []
for roads in unlist :
graphs[roads[0]].append(roads[1])
graphs[roads[1]].append(roads[0])
# DFS 함수 구현
# 해당 도시를 가는데 COUNT가
# K 초과라면 DFS를 하지 않고 끝낸다.
# 이때 COUNT는 전역변수가 아니기 때문에
# 뻗어나가는 가지 대로 COUNT를 가지고 있음
# 카운트어캐함?->매개변수로 넘김
# 한 길목에서 카운트할 거 다 하면 visited 초기화
def dfs(graphs, v, visited, count):
#현재 v
visited[v] = True
for i in graphs[v] :
if not visited[i] :
dfs(graphs, i, visited, count + 1)
length[v] = min(length[v], count)
print(str(v) + " : " + str(length[v]))
visited = [False] * (n + 1)
length = [10] * (n + 1)
dfs(graphs,x,visited,0)
noCity = True
for i in range(1, n + 1) :
if length[i] == k :
print(i)
noCity = False
if noCity :
print(-1)
- BFS로 다음 구역을 지나가기 전에 count를 해줘서 문제를 풀었다.
from collections import deque
n, m, k, x = map(int, input().split())
unlist = [ list(map(int, input().split())) for _ in range(m)]
graphs = [[] for i in range(n + 1)]
graphs[0] = []
for roads in unlist :
graphs[roads[0]].append(roads[1])
graphs[roads[1]].append(roads[0])
# 최단 거리를 찾아야 하므로 깊이 탐색은X
# BFS
def bfs(graphs, start, visited, length):
queue = deque([start])
visited[start] = True
count = 0
while queue :
v = queue.popleft()
count += 1
for i in graphs[v] :
if not visited[i] :
queue.append(i)
length[i] = count
visited[i] = True
visited = [False] * (n + 1)
length = [10] * (n + 1)
bfs(graphs, x, visited, length)
noCity = True
for i in range(1, n + 1) :
if length[i] == k :
print(i)
noCity = False
if noCity :
print(-1)
'코딩테스트' 카테고리의 다른 글
[18121] 문자열 압축 (0) | 2024.02.22 |
---|---|
미로 탈출 (0) | 2024.02.22 |
[5347] LCM (0) | 2024.02.20 |
[20546] 기적의 매매법 (1) | 2024.01.31 |
[이코테] 뱀 (0) | 2024.01.26 |
댓글