본문 바로가기
Algorithm/Baekjoon

15422. Bumped! (Python)

by 원만사 2021. 11. 16.
반응형

 

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

 

15422번: Bumped!

The input consists of a single test case. The first line lists five space-separated integers n, m, f, s, and t, denoting the number of cities n (0 < n ≤ 50 000), the number of roads m (0 ≤ m ≤ 150 000), the number of flights f (0 ≤ f ≤ 1 000), th

www.acmicpc.net

 

풀이

 어떤 한 지점에서 시작해서 최단 거리를 구하는 문제로 다익스트라를 활용해서 문제를 해결할 수 있다. 이 문제에서 비교해야 할 것은 다음과 같다.

s: 여행을 시작하는 도시
t: 여행 목적지(도시)
u: 비행 시작 도시
v: 비행 도착 도시

dijkstra(a, b) : a에서 b까지의 최소 비용

1. s에서 t까지 길을 통해서만 가는 경우 발생하는 최소 비용(비행 편 사용하지 않음)

    -> dijkstra(s, t)

2. s에서 u까지 길을 통해서 가는 최소 비용 + u에서 v까지 무료 비행 편 이용(0원) + v에서 t까지 길을 통해서 가는 최소 비용

    -> dijkstra(s, u) + dijkstra(v, t)

 

 처음 변수에 1번에서 구한 값을 넣어준 후 각 비행편마다 2번을 구해서 둘 중 최솟값을 구해서 최소 비용을 갱신해주면 된다.

 

코드

<Python>

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import heapq
import math
 
INF = math.inf
 
 
def dijkstra(start, end):
    dist = [INF] * n
 
    q = []
    heapq.heappush(q, (0, start))
    dist[start] = 0
 
    while q:
        cost, now = heapq.heappop(q)
 
        if dist[now] < cost:
            continue
        
        for (nextNode, cents) in graph[now]:
            nextCost = cost + cents
 
            if nextCost < dist[nextNode]:
                dist[nextNode] = nextCost
                heapq.heappush(q, (nextCost, nextNode))
    
    return dist[end]
 
 
if __name__ == '__main__':
    # n: city의 개수
    # m: road의 개수
    # f: flight의 개수
    # s: 여행을 시작하는 city 번호
    # t: 여행 가려는 city 번호
    n, m, f, s, t = map(int, input().split())
    graph = [[] for _ in range(n)]
 
    for _ in range(m):
        # a에서 b로, b에서 a로 나는 비용 c
        a, b, c = map(int, input().split())
        graph[a].append((b, c))
        graph[b].append((a, c))
 
    # s에서 t로 가는데 비행 편을 사용하지 않고 갔을 때의 최소 비용
    ans = dijkstra(s, t)
 
    for _ in range(f):
        # u에서 v로 가는 비행 편
        u, v = map(int, input().split())
 
        # ans와 s -> u로 길을 통해서 간 후 u에서 v로 비행 편을 사용한 후 v에서 t로 길을 통해서 갔을 때의 비용 비교 
        ans = min(ans, dijkstra(s, u) + dijkstra(v, t))
    
    print(ans)
 
cs
반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

1068. 트리 (Swift, Python)  (0) 2021.12.02
1738. 골목길 (Swift, Python)  (0) 2021.11.18
11657. 타임머신 (Swift, Python)  (0) 2021.11.14
11404. 플로이드 (Swift, Python)  (0) 2021.11.12
(BOJ) 2644_촌수계산_JAVA  (0) 2020.08.11

댓글