간단하게 다익스트라 알고리즘을 이용하면 해결되는 문제.
시간이 짧기 때문에 우선순위 큐를 써야 하고, 우선순위 큐의 기본 정렬은 내림차순이기때문에 오름차순으로 변경하기 위해
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
로 우선순위 큐를 선언했다.
헤더에 functional을 꼭 넣어야 한다.
그리고 printf()를 안쓰고 깜빡하고 cout을 썼는데 이거 때문에 시간초과 나버렸다. 아깝
//deque.tistory.com
#define _CRT_SECURE_NO_WARNINGS
#define INT_MAX_ 2100000000
#include <iostream>
#include <vector>
#include <queue>
#include <map>
#include <fstream>
#include <string>
#include <algorithm>
#include <functional>
using namespace std;
int V, E, K;
vector<pair<int, int>> adj[20002];
int dist[20002];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
bool isVisit[20002];
int main() {
scanf("%d %d", &V, &E);
scanf("%d", &K);
int from, to, weight;
for (int i = 0; i < E; i++) {
scanf("%d %d %d", &from, &to, &weight);
adj[from].push_back(pair<int, int>(weight, to));
}
for (int i = 1; i <= V; i++) {
dist[i] = INT_MAX_;
}
dist[K] = 0;
pq.push(make_pair(0, K));
while (!pq.empty()) {
int cost = pq.top().first;
int now = pq.top().second;
pq.pop();
if (dist[now] < cost) continue;
if (dist[now] == cost && isVisit[now] == true) continue;
isVisit[now] = true;
for (pair<int, int> next : adj[now]) {
if (dist[next.second] > next.first + cost) {
pq.push(make_pair(next.first + cost, next.second));
dist[next.second] = next.first + cost;
}
}
}
for (int i = 1; i <= V; i++) {
if (dist[i] >= INT_MAX_) printf("INF\n");
else printf("%d\n", dist[i]);
}
return 0;
}
'코딩 > 알고리즘' 카테고리의 다른 글
백준 1865 웜홀 (0) | 2018.01.08 |
---|---|
백준 1504 특정한 최단 경로 (0) | 2018.01.07 |
백준 1766 문제집 (0) | 2018.01.05 |
백준 1516 게임 개발 (0) | 2018.01.04 |
백준 2252 줄세우기 (0) | 2018.01.04 |