โถ ๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ์ด๋?
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(DP)๋ฅผ ํ์ฉํ ์ต๋จ ๊ฒฝ๋ก(Shortest Path) ํ์ ์๊ณ ๋ฆฌ์ฆ.
ํ๋์ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ์ผ๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์๋ ค์ค๋ค.
๊ตฌํ์ Greedy ์๊ณ ๋ฆฌ์ฆ์ด๋ DP ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋๋ฐ,
Greedy ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์๋ ์ด์ ๋ ์ธ์ ํ ๋ ธ๋๋ค ์ค ๊ฐ์ฅ ์์ ๋น์ฉ์ ๊ฐ๊ณ ์๋ ๋ ธ๋๋ฅผ ์ ํํ์ฌ ํ์์ ์งํํ๊ธฐ ๋๋ฌธ์ด๋ค.
DP ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ ์ ์๋ ์ด์ ๋ "์ต๋จ ๊ฑฐ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ค"๋ก ์ด๋ฃจ์ด์ ธ์๊ธฐ ๋๋ฌธ์ด๋ค.
(์ต๋จ ๊ฑฐ๋ฆฌ = ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด๋ค์ ํฉ)
์์ ๊ทธ๋ฆผ์ a(1)์ b(5)์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํ๋ฆ์ ๋ณด์ฌ์ค๋ค.
๊ฐ์ฅ ๋ฎ์ ๊ฐ์ ๊ฐ์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ผญ์ง์ ์ ์ ํํ๊ณ , ๋ฐฉ๋ฌธํ์ง ์์ ๊ฐ ์ธ์ ๋ ธ๋์์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๊ณ , ์์ ๊ฒฝ์ฐ ์ธ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธํ๋ค. (์ฐธ๊ณ : ์ธ์ ํ ๋ ธ๋์ ๋ชจ๋ ๋ฐฉ๋ฌธํ๋ฉด ๋นจ๊ฐ์์ผ๋ก ํ์๋๋ฉฐ out ์ด๋ผ๊ณ ๋ฌ๋ค.)
โถ ๊ตฌํ ๋ฐฉ๋ฒ๊ณผ ์๋ฆฌ
1) ๋น์ฉ์ ๋ด์ ๋ฐฐ์ด์ ๋ง๋ค๊ณ , ๋ฌดํ๋(INF)์ ๊ฐ์ผ๋ก ์ด๊ธฐํ ํ๋ค.
๋ฐฉ๋ฌธ์ฒดํฌ ๋ฐฐ์ด์ ๋ง๋ค๊ณ , false๋ก ์ด๊ธฐํ ํ๋ค.
for (int i = 0; i < V; i++)
dist[i] = INT_MAX, visited[i] = false;
2) ์์๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ๋ ธ๋๋ก ์ฒดํฌํ๋ค. ์์๋ ธ๋์ ์ธ์ ํ ๋ ธ๋๋ค์ ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํด์ ๋น์ฉ์ ์ ๋ฐ์ดํธ ํ๋ค.
visited[current_node] = true;
for (int v = 0; v < V; v++)
if (!visited[v] && graph[current_node][v] && dist[current_node] != INT_MAX
&& dist[current_node] + graph[current_node][v] < dist[v]){
dist[v] = dist[current_node] + graph[current_node][v];
}
3) ์์๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค ์ค ๋น์ฉ์ด ๊ฐ์ฅ ์ ์ ๋ ธ๋๋ฅผ ์ ํํ์ฌ ์ด๋ํ๋ค.
int u = minDistance(dist, visited);
4) ์ด๋ํ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ๋ ธ๋๋ก ์ฒดํฌํ๋ค. ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํด์ ๋น์ฉ์ ์ ๋ฐ์ดํธ ํ๋ค.
visited[u] = true;
for (int v = 0; v < V; v++)
if (!visited[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]){
dist[v] = dist[u] + graph[u][v];
}
4) ๋์ฐฉ์ง์ ์ ๋ค๋ค๋ฅผ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
โถ ์ ์ฒด์ฝ๋
// A C++ program for Dijkstra's single source shortest path algorithm.
// The program is for adjacency matrix representation of the graph
#include <limits.h>
#include <stdio.h>
#define V 9
int minDistance(int dist[], bool visited[]){
int min = INT_MAX, min_index;
for (int v = 0; v < V; v++)
if (visited[v] == false && dist[v] <= min)
min = dist[v], min_index = v;
return min_index;
}
int printSolution(int dist[], int n){
printf("Vertex Distance from Source\n");
for (int i = 0; i < V; i++)
printf("%d \t\t %d\n", i, dist[i]);
}
void dijkstra(int graph[V][V], int src){
int dist[V];
bool visited[V];
for (int i = 0; i < V; i++)
dist[i] = INT_MAX, visited[i] = false;
dist[src] = 0;
for (int count = 0; count < V - 1; count++) {
int u = minDistance(dist, visited);
visited[u] = true;
for (int v = 0; v < V; v++)
if (!visited[v] && graph[u][v] && dist[u] != INT_MAX
&& dist[u] + graph[u][v] < dist[v])
dist[v] = dist[u] + graph[u][v];
}
printSolution(dist, V);
}
int main(){
int graph[V][V] = { { 0, 4, 0, 0, 0, 0, 0, 8, 0 },
{ 4, 0, 8, 0, 0, 0, 0, 11, 0 },
{ 0, 8, 0, 7, 0, 4, 0, 0, 2 },
{ 0, 0, 7, 0, 9, 14, 0, 0, 0 },
{ 0, 0, 0, 9, 0, 10, 0, 0, 0 },
{ 0, 0, 4, 14, 10, 0, 2, 0, 0 },
{ 0, 0, 0, 0, 0, 2, 0, 1, 6 },
{ 8, 11, 0, 0, 0, 0, 1, 0, 7 },
{ 0, 0, 2, 0, 0, 0, 6, 7, 0 } };
dijkstra(graph, 0);
return 0;
}
โถ ์ถ๋ ฅํ๋ฉด
Vertex Distance from Source
0 0
1 4
2 12
3 19
4 21
5 11
6 9
7 8
8 14
์ถ์ฒ: https://www.geeksforgeeks.org/c-program-for-dijkstras-shortest-path-algorithm-greedy-algo-7/
โถ ๊ด๋ จ๋ฌธ์
'๐ Coding Test Study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฝ๋ฉ ํ ์คํธ ๋๋น] ์ฝํ ์๊ฐ๋ณต์ก๋ ๊ณ์ฐ (0) | 2021.09.21 |
---|---|
C++ ๋ฌธ์์ด ๋ค๋ฃจ๊ธฐ (0) | 2021.05.20 |
DP(Dynamic Programming)? (0) | 2021.04.27 |
[Algorithm&์๋ฃ๊ตฌ์กฐ] BFS/DFS? (0) | 2021.04.13 |
[์๋ฃ๊ตฌ์กฐ&์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ? (0) | 2021.04.13 |