본문 바로가기

Algorithm & Data Structure

백준 - 18352번(다익스트라, BFS)

728x90
반응형

https://www.acmicpc.net/problem/18352

 

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

import sys
from collections import deque

n,m,k,x = map(int,sys.stdin.readline().split())

arr = [[]for _ in range(n+1)]

for i in range(m):
    a,b = map(int,sys.stdin.readline().split())
    arr[a].append(b)

check = [False for _ in range(n+1)]

def bfs(s):
    ans = []
    q = deque([[s,0]])
    check[s] = True
    while q:
        n, dist = q.popleft()
        for i in arr[n]:
            if check[i] == False:
                check[i] = True
                if dist+1 < k:
                    q.append([i,dist+1])
                elif dist+1 == k:
                    ans.append(i)

    if len(ans) == 0:
        print(-1)
    else:
        ans.sort()
        for i in ans:
            print(i)

bfs(x)

실버 난이도의 다익스트라 문제이지만 생각을 깊게 하지 않으면 메모리초과와 시간초과로 고생한다.

첫번째로 최단거리가 k와 동일한 원소들을 출력해주면 된다.

해당 문제에서 간선들의 특징은 단방향, 가중치가 1씩만 증가 한다는 것이다.

즉 단방향으로 연결된 간선이 있는데 현재 좌표가 이전 좌표보다 가중치가 1큰것이다.

따라서 따로 가중치를 저장하는 배열을 만들지 않아도 된다.

단방향 간선이기에 arr[a].append(b) 이런식으로 배열을 만들어 준다.

bfs를 실행할때 각 좌표와 해당 좌표의 가중치 값을 같이 비교하면 된다.

가중치가 1씩 증가한다는 의미는 최초방문 즉 check[i]==False일때가 최초방문이고 무조건 최단 거리라는 뜻이다.

check 배열을 통해서 방문처리를 한다. 첫방문에 dist의 값이 k와 같으면 조건에 맞는 정답이 된다. 이를 출력해주면 끝.

 

처음에는 각 좌표마다 가중치를 배열에 저장하려 했지만 주어진 n과 m의 범위가 워낙 커서 이렇게하면 메모리초과가 난다. 주의하자.

728x90
반응형

'Algorithm & Data Structure' 카테고리의 다른 글

백준 - 1753번(다익스트라,우선순위 큐)  (0) 2022.05.22
백준 - 1446번(다익스트라, DP)  (0) 2022.05.21
백준 - 2448번(재귀)  (0) 2022.04.28
백준 - 2630번(재귀)  (0) 2022.04.28
백준 - 11729번(재귀)  (0) 2022.04.28