Make Unreal REAL.
article thumbnail
Level 3. 합승 택시 요금

 

 

플로이드-워셜 알고리즘을 응용하는 문제다.

  • 모든 점들 간의 최단 거리를 구해야 할 때 사용한다.
  • 3중 for문을 이용하는 O(n³) 시간 복잡도 때문에, 정점의 개수가 200개 미만으로 적은 것이 특징이다.
  • 초기화 시 ∞를 무조건 INT_MAX로 설정하면, 더할 때 음수가 돼버리므로 주의해야 한다.

 

우선 모든 점들 간의 최단 거리를 구한 후, (S → I 비용) + (I → A 비용) + (I → B 비용)이 S에서 I까지 합승 후 각자 집으로 간 비용이다.

  • 이 값들의 최솟값을 구하면 된다.

 

#include <iostream>
#include <vector>
#include <algorithm>

#define UNREACHABLE 19'900'000

using namespace std;

int solution(int n, int s, int a, int b, vector<vector<int>> fares)
{
    int answer = UNREACHABLE;
    vector<vector<int>> graph(n + 1, vector<int>(n + 1, UNREACHABLE));

    for (int i = 1; i <= n; ++i)  graph[i][i] = 0;
    for (vector<int>& fr : fares) graph[fr[0]][fr[1]] = graph[fr[1]][fr[0]] = fr[2];

    for (int K = 1; K <= n; ++K)
        for (int S = 1; S <= n; ++S)
            for (int E = 1; E <= n; ++E)
                graph[S][E] = min(graph[S][E], graph[S][K] + graph[K][E]);

    for (int i = 1; i <= n; ++i)
        answer = min(answer, graph[s][i] + graph[i][a] + graph[i][b]);

    return answer;
}

'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글

Level 3. 입국심사  (0) 2023.08.13
Level 2. 택배상자  (0) 2023.08.12
Level 2. 카카오프렌즈 컬러링북  (0) 2023.08.10
Level 3. 기지국 설치  (0) 2023.08.09
Level 3. 순위  (0) 2023.08.08
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그