[Silver II] Title: 특정 거리의 도시 찾기, Time: 1912 ms, Memory: 118956 KB -BaekjoonHub

This commit is contained in:
SSUM
2025-02-27 00:16:34 +09:00
parent a3a8fad7c1
commit f36d721808
2 changed files with 89 additions and 0 deletions

View File

@@ -0,0 +1,38 @@
# [Silver II] 특정 거리의 도시 찾기 - 18352
[문제 링크](https://www.acmicpc.net/problem/18352)
### 성능 요약
메모리: 118956 KB, 시간: 1912 ms
### 분류
너비 우선 탐색, 데이크스트라, 그래프 이론, 그래프 탐색, 최단 경로
### 제출 일자
2025년 2월 27일 00:14:07
### 문제 설명
<p>어떤 나라에는 1번부터 <em>N</em>번까지의 도시와 <em>M</em>개의 단방향 도로가 존재한다. 모든 도로의 거리는 1이다.</p>
<p>이 때 특정한 도시 <em>X</em>로부터 출발하여 도달할 수 있는 모든 도시 중에서, 최단 거리가 정확히 <em>K</em>인 모든 도시들의 번호를 출력하는 프로그램을 작성하시오. 또한 출발 도시 <em>X</em>에서 출발 도시 <em>X</em>로 가는 최단 거리는 항상 0이라고 가정한다.</p>
<p>예를 들어 <em>N</em>=4, <em>K</em>=2, <em>X</em>=1일 때 다음과 같이 그래프가 구성되어 있다고 가정하자.</p>
<p style="text-align: center;"><img alt="" src="" style="height: 249px; width: 250px;"></p>
<p style="text-align: justify;">이 때 1번 도시에서 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 2인 도시는 4번 도시 뿐이다. 2번과 3번 도시의 경우, 최단 거리가 1이기 때문에 출력하지 않는다.</p>
### 입력
<p>첫째 줄에 도시의 개수 <em>N</em>, 도로의 개수 <em>M</em>, 거리 정보 <em>K</em>, 출발 도시의 번호 <em>X</em>가 주어진다. (2 ≤ <em>N </em>≤ 300,000, 1 ≤ <em>M </em>≤ 1,000,000, 1 ≤ <em>K </em>≤ 300,000, 1 ≤ <em>X </em>≤ <em>N</em>) 둘째 줄부터 <em>M</em>개의 줄에 걸쳐서 두 개의 자연수 <em>A</em>, <em>B</em>가 공백을 기준으로 구분되어 주어진다. 이는 <em>A</em>번 도시에서 <em>B</em>번 도시로 이동하는 단방향 도로가 존재한다는 의미다. (1 ≤ <em>A</em>, <em>B </em>≤ <em>N</em>) 단, <em>A</em>와 <em>B</em>는 서로 다른 자연수이다.</p>
### 출력
<p><em>X</em>로부터 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 <em>K</em>인 모든 도시의 번호를 한 줄에 하나씩 오름차순으로 출력한다.</p>
<p>이 때 도달할 수 있는 도시 중에서, 최단 거리가 <em>K</em>인 도시가 하나도 존재하지 않으면 -1을 출력한다.</p>

View File

@@ -0,0 +1,51 @@
import sys
from collections import defaultdict
import math
from collections import deque
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
N, M, K, X = map(int, input().split())
route = defaultdict(list)
visited = [-1] * (N+1)
def makeroute(A, B):
if not route[A]:
route[A] = []
route[A].append(B)
def BFS(start, route):
queue = deque()
queue.append(start)
visited[start] += 1
while queue:
temp = queue.popleft()
for neighbor in route[temp]:
if visited[neighbor] == -1:
visited[neighbor] = visited[temp] + 1
queue.append(neighbor)
for i in range(M):
A, B = map(int, input().split())
makeroute(A,B)
BFS(X, route)
answer =[]
for i in range(N+1):
if visited[i] == K:
answer.append(i)
if(not answer):
print('-1')
else:
answer.sort()
for i in answer:
print(i)