728x90

ㅁㄴㅇㅁㄴㅇ


 

다익스트라의 기본 격인 문제이다.

시작점이 주어지므로 해당하는 시작점부터 다른 노드들까지의 최단 경로를 구하자.

우선 거리를 저장할 dist 배열을 INF로 초기화한다. 그 후 다익스트라를 실행하자.

start의 거리를 0으로 설정한 후 최소힙을 선언한다.

큐는 현재까지의 거리와 현재 위치를 pair로 저장한다. 최소힙으로 선언했기 때문에 거리가 짧은 곳부터 읽게된다.

 

큐에서 top에 있는 값을 꺼낸 후 해당 위치와 연결된 다른 노드들을 모두 검사하면서 현재까지 거리와 해당하는 곳 까지의 거리를 합한 게 더 작다면 최신화해주고 해당 노드를 방문한다.

이렇게 모든 노드를 방문하면 모든 지점까지의 최단 거리를 알 수 있다.

 

코드 원본 : https://github.com/chosh95/STUDY/blob/master/BaekJoon/2020/%EC%B5%9C%EB%8B%A8%EA%B2%BD%EB%A1%9C%20(1753%EB%B2%88).cpp

 

chosh95/STUDY

프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.

github.com

C++ 코드

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int V, E;
int start;
vector<pair<int, int>> v[20001]; //v[a] = (b,c) : a부터 b까지 c의 거리
int dist[20001];

void dijk() {
	dist[start] = 0;
	priority_queue<pair<int, int>, vector<pair<int,int>>, greater<pair<int,int>>> q; //거리, 시작점, 최소힙으로 선언
	q.push({ 0, start });
	while (!q.empty()) {
		int x = q.top().second;
		int d = q.top().first;
		q.pop();
		
		for (int i = 0; i < v[x].size(); i++) {
			int nx = v[x][i].first;
			int nd = v[x][i].second;
			if (dist[nx] > dist[x] + nd) {
				dist[nx] = dist[x] + nd;
				q.push({ dist[nx], nx });
			}
		}
	}
}

int main()
{
	cin >> V >> E >> start;
	for (int a,b,c,i = 0; i < E; i++) {
		cin >> a >> b >> c;
		v[a].push_back({ b,c });
	}

	for (int i = 1; i <= V; i++)
		dist[i] = 987654321;
	dijk();

	for (int i = 1; i <= V; i++)
		if (dist[i] == 987654321)
			cout << "INF\n";
		else
			cout << dist[i] << "\n";
	
}
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 파티 (1238번)  (0) 2020.07.02
[백준] 특정한 최단 경로 (1504번)  (0) 2020.07.01
[백준] 좌표 압축 (18870번)  (0) 2020.07.01
[백준] 비밀번호 찾기 (17219번)  (0) 2020.07.01
[백준] Four Squares (17626번)  (0) 2020.07.01

+ Recent posts