알고리즘/BOJ

[BOJ 23030, Python 3] 후다다닥을 이겨 츄르를 받자!

70825 2021. 9. 24. 18:30
반응형

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

 

23030번: 후다다닥을 이겨 츄르를 받자!

쿠기는 평소 지하철 최단 경로를 탐색하여 소요 시간을 알려주는 '후다다닥' 어플을 사용 중이다. 그러나 쿠기는 걸음이 너무 느려서 '후다다닥'이 알려주는 경로를 따라가면 항상 지하철이 떠

www.acmicpc.net

 

풀이

지문이 좀 길지만 간단하게 정리해보면

노선 N개가 있고, 각 노선내에서 이동하는 경우는 시간이 1이 걸림

환승역에서 다른 노선으로 환승할 때는 T의 시간이 걸림(사람마다 T가 다름)

으로 정리할 수 있습니다.

 

이동하는데 걸리는 시간이 1 또는 T 총 2가지가 있으므로 BFS는 불가능하고, 다익스트라를 사용하여 최단거리 탐색을 할 수 있게 됩니다.

 

역을 저장할 때는 (노선 번호, 역 번호)로 저장을 해야 환승역을 저장할 때 겹치지 않게 저장할 수 있습니다.

 

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
input = __import__('sys').stdin.readline
from heapq import *
 
= int(input())
station = [*map(int, input().split())]
stations = [[[] for _ in range(station[i])] for i in range(n)]
 
for i in range(n):
    for j in range(station[i]):
        if j - 1 >= 0: stations[i][j].append((i, j-1))
        if j + 1 < station[i]: stations[i][j].append((i, j+1))
 
= int(input())
for i in range(m):
    p1, p2, q1, q2 = map(int, input().split())
    p1-=1; p2-=1; q1-=1; q2-=1
    stations[p1][p2].append((q1, q2))
    stations[q1][q2].append((p1, p2))
 
for _ in range(int(input())):
    S = [[float('inf')] * station[i] for i in range(n)]
    t, u1, u2, v1, v2 = map(int, input().split())
    u1-=1; u2-=1; v1-=1; v2-=1
    q = []; heappush(q, (u1, u2))
    S[u1][u2] = 0
    while q:
        x, y = heappop(q)
        for nx, ny in stations[x][y]:
            if x == nx and S[nx][ny] > S[x][y] + 1:
                S[nx][ny] = S[x][y] + 1
                heappush(q, (nx, ny))
            elif x != nx and S[nx][ny] > S[x][y] + t:
                S[nx][ny] = S[x][y] + t
                heappush(q, (nx, ny))
    print(S[v1][v2])
cs
반응형