πŸ‘©πŸ»‍🌾

[λ°±μ€€/Python] 18352번 νŠΉμ • 거리의 λ„μ‹œ μ°ΎκΈ° λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ/λ°±μ€€(BOJ)

[λ°±μ€€/Python] 18352번 νŠΉμ • 거리의 λ„μ‹œ μ°ΎκΈ°

μ₯¬μŠ€μ΄ 2023. 3. 21. 15:00
728x90

1οΈβƒ£λ¬Έμ œ μ„€λͺ…

μ–΄λ–€ λ‚˜λΌμ—λŠ” 1λ²ˆλΆ€ν„° Nλ²ˆκΉŒμ§€μ˜ λ„μ‹œμ™€ M개의 단방ν–₯ λ„λ‘œκ°€ μ‘΄μž¬ν•œλ‹€. λͺ¨λ“  λ„λ‘œμ˜ κ±°λ¦¬λŠ” 1이닀.

이 λ•Œ νŠΉμ •ν•œ λ„μ‹œ Xλ‘œλΆ€ν„° μΆœλ°œν•˜μ—¬ 도달할 수 μžˆλŠ” λͺ¨λ“  λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 μ •ν™•νžˆ K인 λͺ¨λ“  λ„μ‹œλ“€μ˜ 번호λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. λ˜ν•œ 좜발 λ„μ‹œ Xμ—μ„œ 좜발 λ„μ‹œ X둜 κ°€λŠ” μ΅œλ‹¨ κ±°λ¦¬λŠ” ν•­μƒ 0이라고 κ°€μ •ν•œλ‹€.

예λ₯Ό λ“€μ–΄ N=4, K=2, X=1일 λ•Œ λ‹€μŒκ³Ό 같이 κ·Έλž˜ν”„κ°€ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€κ³  κ°€μ •ν•˜μž.

이 λ•Œ 1번 λ„μ‹œμ—μ„œ μΆœλ°œν•˜μ—¬ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 2인 λ„μ‹œλŠ” 4번 λ„μ‹œ 뿐이닀.  2번과 3번 λ„μ‹œμ˜ 경우, μ΅œλ‹¨ 거리가 1이기 λ•Œλ¬Έμ— 좜λ ₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

2οΈβƒ£μž…λ ₯

첫째 쀄에 λ„μ‹œμ˜ 개수 N, λ„λ‘œμ˜ 개수 M, 거리 정보 K, 좜발 λ„μ‹œμ˜ 번호 Xκ°€ 주어진닀. (2 ≤ ≤ 300,000, 1 ≤ ≤ 1,000,000, 1 ≤ ≤ 300,000, 1 ≤ ≤ N) λ‘˜μ§Έ 쀄뢀터 M개의 쀄에 κ±Έμ³μ„œ 두 개의 μžμ—°μˆ˜ ABκ°€ 곡백을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„λ˜μ–΄ 주어진닀. μ΄λŠ” A번 λ„μ‹œμ—μ„œ B번 λ„μ‹œλ‘œ μ΄λ™ν•˜λŠ” 단방ν–₯ λ„λ‘œκ°€ μ‘΄μž¬ν•œλ‹€λŠ” μ˜λ―Έλ‹€. (1 ≤ A≤ N) 단, A와 BλŠ” μ„œλ‘œ λ‹€λ₯Έ μžμ—°μˆ˜μ΄λ‹€.

3οΈβƒ£μΆœλ ₯

Xλ‘œλΆ€ν„° μΆœλ°œν•˜μ—¬ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 K인 λͺ¨λ“  λ„μ‹œμ˜ 번호λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 좜λ ₯ν•œλ‹€.

이 λ•Œ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 K인 λ„μ‹œκ°€ ν•˜λ‚˜λ„ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ -1을 좜λ ₯ν•œλ‹€.

 


πŸ‘©πŸ»‍πŸ’»μž‘μ„±ν•œ μ½”λ“œ

import sys
from collections import deque

input = sys.stdin.readline

n, m, k, x = map(int, input().split())  # λ„μ‹œ 개수, λ„λ‘œ 개수, 거리 정보, μΆœλ°œλ„μ‹œ 번호
A = [[]for _ in range(n+1)]  # μ—°κ²°λœ λ„μ‹œ 정보 μ €μž₯
visited = [-1] * (n + 1)    # 거리 정보 μ €μž₯
answer = []

for i in range(m):
    a, b = map(int, input().split())
    A[a].append(b)


def BFS(v):
    queue = deque()
    queue.append(v)
    visited[v] += 1
    while queue:
        current = queue.popleft()
        for i in A[current]:
            if visited[i] == -1:
                visited[i] = visited[current] + 1   # 거리 계산
                queue.append(i)


BFS(x)

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)

πŸ’‘μ½”λ“œ μ„€λͺ…

μ΄μ „κΉŒμ§€ ν’€μ—ˆλ˜ BFS λ¬Έμ œμ™€ λ‹€λ₯΄κ²Œ 이번 λ¬Έμ œλŠ” 리슀트 visited에 방문기둝이 μ•„λ‹Œ 거리 정보λ₯Ό μ €μž₯ν–ˆλ‹€. 

for i in range(m):
    a, b = map(int, input().split())
    A[a].append(b)

β¬†οΈμ—°κ²°λœ λ„μ‹œ 정보λ₯Ό μž…λ ₯ λ°›μ•„ 리슀트 A에 μ €μž₯ν•œλ‹€.

def BFS(v):
    queue = deque()
    queue.append(v)
    visited[v] += 1
    while queue:
        current = queue.popleft()
        for i in A[current]:
            if visited[i] == -1:
                visited[i] = visited[current] + 1   # 거리 계산
                queue.append(i)

β¬†οΈλ§€κ°œλ³€μˆ˜λ‘œ λ“€μ–΄μ˜¨ λ„μ‹œμ™€ μ—°κ²°λœ λ„μ‹œκ°€ νƒμƒ‰λœ 적이 μžˆλŠ”μ§€ ν™•μΈν•˜μ—¬ 탐색 전이라면 ν•΄λ‹Ή λ„μ‹œμ˜ 거리λ₯Ό visited[current] + 1둜 μ €μž₯ν•΄μ€€λ‹€. -> visited[v]의 값이 -1인 λ„μ‹œλŠ” 아직 λ°©λ¬Έ X

728x90
Comments