문제
접근 방법
한 정점에서 모든 정점을 최소비용으로 가는 방법을 구하는 문제이므로 이는 다익스트라 알고리즘을 활용해 해결할 수 있다.
즉, 구하고자하는 마을과 버스 노선을 그래프로 그려 이를 활용해 우선순위 큐로 문제를 해결한다.
코드
#include <iostream> #include <vector> #include <utility> #include <queue> #include <cstring> using namespace std; // N: 마을 수, M: 버스 노선 수, source: 출발, destination: 목적지, dis[]: 거리 int N, M, source, destination, dis[1001]; vector<vector<pair>> graph; priority_queue<pair<int, int>> pq; int main() { cin >> N; cin >> M; // 그래프의 노드는 마을이므로 사이즈 증가 graph.resize(N+1); for(int i = 0; i < M; i ++) { int from, to, cost; cin >> from >> to >> cost; // 현재 마을에서 다음 마을까지의 요소를 현재 마을 인덱스에 저장 graph[from].push_back(make_pair(to, cost)); } cin >> source >> destination; // 우선순위 큐에 출발지 정보 삽입 pq.push({0, source}); memset(dis, -1, sizeof(dis)); while(!pq.empty()) { // 우선순위 큐는 기본적으로 max heap을 활용하므로 - 값을 취함 int cost = -pq.top().first; int location = pq.top().second; pq.pop(); // 이전 방문 기록이 있으면 무시 if(dis[location] != -1) { continue; } dis[location] = cost; for(int i = 0; i < graph[location].size(); i ++) { int n_location = graph[location][i].first; // 가장 작은 비용이 상위에 저장되어야 하므로 - 값 int n_cost = -graph[location][i].second - cost; if(dis[n_location] != -1) { continue; } pq.push({n_cost, n_location}); } } cout << dis[destination]; return 0; }