-
[1753] 최단경로BOJ 2021. 9. 13. 18:17
https://www.acmicpc.net/problem/1753
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다.
www.acmicpc.net
<문제>
입력은 방향그래프가 들어온다.
노드의 개수가 2만개여서 방향데이터를 인접리스트로 저장해야 한다.
가중치는 10이하의 자연수, 노드의 개수는 30만으로 힙을 이용한 다익스트라를 구현하면 된다.
<소스코드>
12345678910111213141516171819202122232425262728293031323334353637383940#include<queue>#include<vector>#include<iostream>using namespace std;#define INF 100000000priority_queue<pair<int, int> >q;vector<pair<int, int>> v[20005];int d[20005];int n, m, s;int main(void) {int i, j, a, b, c,cost,num,next, ncost;cin >> n >> m >> s;for (i = 0; i < m; i++) {cin >> a >> b >> c;v[a].push_back(make_pair(b, c));}for (i = 1; i <= n; i++)d[i] = INF;d[s] = 0;q.push(make_pair(0, s));while (!q.empty()) {cost = -q.top().first;num = q.top().second;q.pop();for (i = 0; i < v[num].size(); i++) {next = v[num][i].first;ncost = v[num][i].second;if (d[next] > cost + ncost) {d[next] = cost + ncost;q.push(make_pair(-d[next], next));}}}for (i = 1; i <= n; i++) {if (d[i] == INF)cout << "INF" << "\n";else cout << d[i] << "\n";}return 0;}cs 'BOJ' 카테고리의 다른 글
[1759] 암호 만들기 (0) 2021.09.13 [1197] 최소 스패닝 트리 (0) 2021.09.13 [11508] 2+1 세일 (0) 2021.09.12 [2011] 암호코드 (0) 2021.09.11 [16236] 아기 상어 (0) 2021.09.09