반응형

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

 

17940번: 지하철

대학원생인 형욱이는 연구실에 출근할 때 주로 지하철을 이용한다. 지하철은 A와 B, 두 개의 회사에서 운영하고 있다. 두 회사는 경쟁사 관계로 사람들이 상대 회사의 지하철을 이용하는 것을 매

www.acmicpc.net

 

환승 횟수가 최소인 경로 중에서 소요 시간이 가장 짧은 경로를 찾아야합니다.

환승을 하는 경우, 소요 시간에 나올 수 있는 최대 시간보다 큰 값의 가중치를 더해줍니다.

다익스트라를 수행한 뒤, 가중치로 나눈 값이 환승 횟수, 가중치로 나눈 나머지가 소요 시간입니다.

 

#include <iostream>
#include <vector>
#include <queue>
#define INF 2147483647
#define W 1000000
using namespace std;

int n, m, c[1000], e;
vector<pair<int, int>> graph[1000];

int dijkstra() {
    priority_queue<pair<int, int>> pq;
    vector<int> dist(1000, INF);
    dist[0] = 0;
    pq.push({ 0, 0 });
    while (!pq.empty()) {
        int node = pq.top().second;
        int cost = -pq.top().first;
        pq.pop();
        if (dist[node] < cost) continue;
        for (int i = 0; i < graph[node].size(); i++) {
            int nextNode = graph[node][i].first;
            int nextCost = cost + graph[node][i].second;
            if (nextCost < dist[nextNode]) {
                dist[nextNode] = nextCost;
                pq.push({ -nextCost, nextNode });
            }
        }
    }
    return dist[m];
}

int main() {
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++) {
        scanf("%d", &c[i]);
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &e);
            if (e == 0) continue;
            graph[i].push_back({ j, e + (c[i] != c[j] ? W : 0) });
        }
    }
    int res = dijkstra();
    printf("%d %d", res / W, res % W);
}
반응형

'Algorithm' 카테고리의 다른 글

백준 2170 : 선 긋기  (0) 2021.11.17
백준 6198 : 옥상 정원 꾸미기  (0) 2021.11.17
백준 5549 : 행성 탐사  (0) 2021.11.17
백준 1689 : 겹치는 선분  (0) 2021.11.17
백준 2352 : 반도체 설계  (0) 2021.11.17

+ Recent posts