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

일반적인 선형탐색 다익스트라구현은 O(N^2)라 입력범위 때문에 당연히 시간초과가 뜰거라서, O(NlogN)방식의 풀이를 사용해야합니다.

우선순위큐를 활용한 방법이 있기때문에 그 방법을 사용했습니다.

모르시는분들은 손수 구현하기 힘드니 아래의 링크나 다른 자료들을 참고하시는게 좋을것 같습니다.!

https://jow1025.tistory.com/109

다익스트라를 구현하고 입력조건만 맞추면되므로 설명은 생략합니다.!


코드

#include<iostream>
#include<queue>
#include<vector>
int INF = 100000000;
using namespace std;

vector<pair<int, int>>a[20001];
int d[20001];
void dijkstra(int start);
int main()
{
	cin.tie(0);
	cin.sync_with_stdio(false);
	int V, E, k, u, v, w;
	cin >> V >> E >> k;
	for (int i = 1; i <= V; i++)
		d[i] = INF;

	for (int i = 0; i < E; i++)
	{
		cin >> u >> v >> w;
		a[u].push_back(make_pair(v, w));
	}
	dijkstra(k);
	for (int i = 1; i <= V; i++)
	{
		if (d[i] == INF)
			cout << "INF" << '\n';
		else cout << d[i] << '\n';
	}

}
void dijkstra(int start)
{
	d[start] = 0;
	priority_queue<pair<int, int>>pq;
	pq.push(make_pair(0, start));
	while (!pq.empty())
	{
		int distance = -pq.top().first;
		int current = pq.top().second;
		pq.pop();
		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
[백준 1916] 최소비용 구하기  (0) 2020.01.23

+ Recent posts