문제 링크 : https://www.acmicpc.net/problem/18352
참고한 블로그 :
https://yabmoons.tistory.com/364
https://code-lab1.tistory.com/29
다익스트라 알고리즘
그래프에서 시작 노드가 주어질 때, 다른 모든 노드들까지의 최소 비용을 구하는데 적합한 알고리즘
(단, 가중치가 음수인 경우에는 적용할 수 없다.)
알고리즘 동작 원리
배열을 이용해서 코딩을 하면 시간복잡도가 O(n²)이 나오게 되고 우선순위 큐를 이용하면 O(E * logN)로 줄일 수 있다고 한다.
문제 코드는 다익스트라 알고리즘 코드를 그대로 쓰고 아래에 출력 조건만 적어서 제출했다.
<작성한 코드>
#include <iostream>
#include <vector>
#include <queue>
#define INF 9999999
using namespace std;
int n, m, k, x;
vector<pair<int, int>> v[300001];
void dijkstra(){
vector<int> dist(n + 1, INF); // 처음에 INF로 초기화
priority_queue<pair<int, int>> pq; // (cost, cur)
dist[x] = 0;
pq.push({0, x});
while(!pq.empty()){
int cost = -pq.top().first;
int cur = pq.top().second;
pq.pop();
for(int i = 0; i < v[cur].size(); i++){
int next = v[cur][i].first; // 다음 노드
int ncost = cost + v[cur][i].second; // 다음 노드까지의 가중치
if(ncost < dist[next]){ // 더 작은 값을 구한 경우
dist[next] = ncost; // 값 갱신
pq.push({-ncost, next}); // pq에 삽입
}
}
}
bool flag = true;
for(int i = 1; i <= n; i++){
if(dist[i] == k){
flag = false;
cout << i << endl;
}
}
if(flag) // 최단거리가 k인 도시가 없는 경우 -1 출력
cout << -1;
}
int main(){
scanf("%d %d %d %d", &n, &m, &k, &x);
for(int i = 0; i < m; i++){
int x, y;
scanf("%d %d", &x, &y);
v[x].push_back({y, 1}); // cost는 전부 1
}
dijkstra();
}