Algorithm

다익스트라 알고리즘(Dijkstra Algorithm)

☞ 최단 경로를 구하기 위해선 어떤 방법을 써야할까?

 

우리는 BFS(너비우선탐색)을 이용해서 어떤 한 점까지 최소 거리를 알 수 있었고, 또한 경로를 구할 수 있었다.

하지만 너비우선탐색을 이용해 구할 때는 가중치가 없을 때라는 조건이 있었다.......

가중치가 있고, 방향성 그래프일때 어떤 방식을 이용해 최단 경로, 최소 거리를 구할 수 있을까?...

여기서 다익스트라 알고리즘이 나온다. 다익스트라 알고리즘이란 그래프 간선에 가중치가 있을 때 최단 경로를 구할 수 있는 알고리즘이며, 너비 우선탐색을 조금 변형해서 만든 알고리즘이라 할 수 있다.

 

BFS를 사용해 최단 경로를 구하는 반면, 다익스트라 알고리즘우선순위큐를 사용해 최단 경로를 구할 수 있다.

다익스트라의 원리를 살펴보면,,,,,

먼저 dist는 시작점(0의 값을 갖는다)부터 다른 점까지의 거리를 저장하며, 우선순위큐는 pair<거리, 정점>을 저장시켜준다.

priority_queue<pair<int, int>> pq;

 

bfs처럼과 비슷하게 알고리즘을 작성하지만, 여기서 크게 다른 점은 한 점의 원래의 dist값보다 우선순위큐를 이용해 구한 새로운 nextDist값이 더 작을 때 바꿔줌을 알 수 있다.

vector<int> dijkstra(int start) {
	vector<int> dist(V+1, INF);
	dist[start] = 0;
	priority_queue<pair<int, int>> pq;
	pq.push(make_pair(0, start));
	while (!pq.empty()) {
		int cost = -pq.top().first;
		int here = pq.top().second;
		pq.pop();
		if (dist[here] < cost) continue;

		for (int i = 0; i < adj[here].size(); i++) {
			int there = adj[here][i].first;
			int nextDist = cost + adj[here][i].second;
			//원래의 dist값과 큐를 이용해 구해진 nextDist값을 비교해 nextDist값이 더 적으면 대체.
			if (dist[there] > nextDist) {
				dist[there] = nextDist;
				pq.push(make_pair(-nextDist, there));
			}
		}
	}
	return dist;
}

※ 자! 근데, 방향성 그래프일때 사용 할 수 있다했는데, 무방향성 그래프일때는 어떻게 최단 경로를 구할 수 있을까?

 - 무방향성 그래프는 쉽게 말해 방향이 없고 둘 다 갈 수 있기 때문에, 방향을 가진 간선 2개를 이용해 무방향성에서 방향성으로 바꿔준다.  (- => ↔) (단, 간선의 가중치가 음수가 있을 때는 음수 사이클이 발생 할 수 있기 때문에 불가능하다.)

 

궁금하신 것이 있으시다면 댓글로 남겨주세요!~

반응형