문제 출처: https://www.acmicpc.net/problem/1916


풀이

일반적인 다익스트라구현은O(V^2)이고, 우선순위큐를 활용한 다익스트라구현은 O(ElogV)인데, 입력범위를 보면

v^2=1,000,000이고, 2^10은 1024이므로 대략 ElogV=1,000,000쯤이므로 어떠한 방법을 사용하던지 pass를 받을 수 있습니다.

저는 우선순위큐를 이용한방법으로 풀었습니다. 

주의할 것은, "a에서 b로 가는길이 있다는것은 b에서 a로 가는길이 있다" 를 의미하는게 아니므로, 이 문제는

무방향그래프가 아닌 방향그래프입니다. 그것말고는 딱히 주의할것은 없는 것 같습니다.


코드

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int INF = 100000000;
vector < pair<int, int>>a[1001];
int d[1001];
void dijkstra(int start);
int main()
{
	cin.tie(0);
	cin.sync_with_stdio(false);
	int n, m, v1, v2, w, start, end;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		d[i] = INF;

	for (int i = 0; i < m; i++)
	{
		cin >> v1 >> v2 >> w;
		a[v1].push_back(make_pair(v2, w));
	}
	cin >> start >> end;
	dijkstra(start);
	
	cout << d[end] << '\n';
}
void dijkstra(int start)
{
	d[start] = 0;
	priority_queue<pair<int, int>>pq;
	pq.push({ 0, start });
	while (!pq.empty())
	{
		int current = pq.top().second;
		int distance = -pq.top().first;
		pq.pop();
		//최단거리가 아니면 skip
		if (d[current] < distance)
			continue;
		for (int i = 0; i < a[current].size(); i++)
		{
			int next = a[current][i].first;
			int next_distance = distance + a[current][i].second;
			if (d[next] > next_distance)
			{
				d[next] = next_distance;
				pq.push(make_pair(-next_distance, next));
			}

		}
	}
	
}


결과


'문제풀이(BOJ) > 다익스트라' 카테고리의 다른 글

[백준 1719] 택배  (0) 2020.01.24
[백준 1238] 파티  (0) 2020.01.24
[백준 1753] 최단경로  (0) 2020.01.22

+ Recent posts