Dijkstra ์๊ณ ๋ฆฌ์ฆ
์ต๋จ ๊ฒฝ๋ก(Shortest Path) ์ฐพ๊ธฐ๋ ์ฃผ์ด์ง ๊ฐ์ค์น ๊ทธ๋ํ์์ ์ถ๋ฐ์ ์์ ๋์ฐฉ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ด ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ ์ค ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก Dijkstra ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
Dijkstra ์๊ณ ๋ฆฌ์ฆ์ ์ถ๋ฐ์ ์์ ๊ฐ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ด์ ์ ๋ฐฐ์ ๋ Prim์ MST ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ ์ฌํ๋ค.
์ด๋ค ์ ์ด ์ฐจ์ด๊ฐ ์๋ํ๋ฉด, Prim ์๊ณ ๋ฆฌ์ฆ์ ์์์ ์ ์์๋ถํฐ ์์์ ํ์ง๋ง, Dijkstra ์๊ณ ๋ฆฌ์ฆ์ ์ถ๋ฐ ์ง์ ์ด ์๋ค. ๋ํ Prim ์๊ณ ๋ฆฌ์ฆ์์๋ ๋ฐฐ์ด D์ ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ์ ์ฅํ์ง๋ง, Dijkstra ์๊ณ ๋ฆฌ์ฆ์ ๋ฐฐ์ด D์ ์ถ๋ฐ์ ์์ ๊ฐ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ค. Prim ์๊ณ ๋ฆฌ์ฆ์ ๊ดํด ๊ถ๊ธํ๋ค๋ฉด, ์๋ ํฌ์คํ ์ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
[์๊ณ ๋ฆฌ์ฆ] ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST) - Kruskal, Prim, Sollin ์๊ณ ๋ฆฌ์ฆ
์ต์ ์ ์ฅ ํธ๋ฆฌ(Minimum Spanning Tree, MST)์ด๋? ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์์, ์ ์ฅ ํธ๋ฆฌ๋ ๋ฌด์์ธ์ง ์์์ผ ํ๋ค. ์ด๋ ์ฐ๊ฒฐ ๊ทธ๋ํ์ ๋ถ๋ถ ๊ทธ๋ํ๋ก, ๋ชจ๋ ์ ์ ๊ณผ ๊ฐ์ ์ ๋ถ๋ถ์งํฉ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
devrepo.tistory.com
Dijkstra ์๊ณ ๋ฆฌ์ฆ์ ์ค์ํ ํน์ง ์ค ํ๋๋ ์ด๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ผ๋ ์์๊ฐ ์์ผ๋ฉด ์๋๋ค. ๋ง์ฝ ์์๊ฐ ์๋ค๋ฉด ์ต์ ํด๋ฅผ ์ฐพ์ ์ ์๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
Dijkstra ์๊ณ ๋ฆฌ์ฆ์ ๋์ ๋ฐฉ์์ D ๋ฐฐ์ด์ ์๋ ๊ฐ์ด ์ต์์ธ ์ ์ ์ผ๋ก minVertax๋ฅผ ์ ์ ํ๊ณ , ๊ทธ minVertex์ ์ด์ ์ ์ ๋ค์ ๊ฐฑ์ ํด์ค๋ค.
์ฆ, Dijkstra๋ ํ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ๊น์ง ๊ฐ๋ ์ต์์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ฃผ๊ธฐ ์ํด ๊ตฌํด์ฃผ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ minVertex ์ด์ ์ ์ ๋ค์ ๊ฐฑ์ ํด์ฃผ๊ณ ์ ์ฒด D ์ค ์ต์ ๊ฐ์ผ๋ก ๋ฐฉ๋ฌธํ๋ค. prim์ ์ด์ ๋ฌ๋ฆฌ ํธ๋ฆฌ๋ฅผ ํ๋ ํ๋ ์ถ๊ฐํด ์ฃผ๊ธฐ ๋๋ฌธ์ ํธ๋ฆฌ์ ๊ฐ ๊ฒฝ๊ณ ์ ์ ์์ ์ด์ํ minVertax๋ฅผ ๊ตฌํ๊ณ , D ๋ฐฐ์ด์ ๊ฐฑ์ ํ๋ฉฐ ํธ๋ฆฌ๋ฅผ ๊ตฌํด์ฃผ๋ ๊ฒ์ด๋ค.
๋งค๋ฒ ์ ์ ์ ๋ฐฉ๋ฌธํ ๋ ๋ง๋ค ๋ฐฉ๋ฌธํ ์ ์ ์ ์ธ์ ํ ์ ์ ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํด์ฃผ๋ ๊ณผ์ ์ ๊ฐ์ ์ํ(Edge Relaxation)์ด๋ผ๊ณ ํ๋ค.
์ฃผ์ํ ์ ์ Dijkstra ์๊ณ ๋ฆฌ์ฆ์ D์ ์์ ๊ฐ์ ์ฆ๊ฐ ์์ผ๋ก minVex๋ฅผ ์ ํํ๊ณ , ํ ๋ฒ ๋ฐฉ๋ฌธ๋ ์ ์ ์ D์์๋ ๊ฐฑ์ ํ์ง ์๋๋ค. ์ด์ ๋ฐ๋ผ ๊ฐ์ค์น์ ๊ฐ์ด ์์๊ฐ ์ค๋ ๊ฒฝ์ฐ, ์ต์ ๊ฐ์ ์ฐพ์ง ๋ชปํ ์๋ ์๋ค.
Dijkstra ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ
class DijkstraSP {
public int N;
List<Edge>[] graph;
// ๋ฐฉ๋ฌธ ๊ธฐ๋ก ์ ์ฅ ๋ฐฐ์ด
public int[] previous;
public DijkstraSP(List<Edge>[] adjList) {
N = adjList.length;
previous = new int[N];
graph = adjList;
}
// ์ต์ ๊ฒฝ๋ก ๊ตฌํ๊ธฐ
public int[] shortestPath(int s) {
boolean[] visited = new boolean[N];
int[] D = new int[N];
// ์ด๊ธฐํ ๋จ๊ณ, D ๋ฐฐ์ด์ INF ๊ฐ์ผ๋ก ์ด๊ธฐํ
for(int i =0; i<N; i++) {
visited[i] = false;
previous[i] = -1;
D[i] = Integer.MAX_VALUE;
}
// s๋ฒ ์ ์ ๋ถํฐ ์์ํ๋ค.
previous[s] = 0;
D[s] = 0;
for(int k=0; k<N; k++) {
int minVertex = -1;
int min = Integer.MAX_VALUE;
// ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ์์ ์ธ์ ์ ์ ๋ฐฉ๋ฌธ
for(int j=0; j<N; j++) {
if ((!visited[j]) && (D[j] < min)) {
min = D[j];
minVertex = j;
}
}
// ํด๋น ์ธ์ ์ ์ ๋ฐฉ๋ฌธ
visited[minVertex] = true;
// ์ธ์ ์ ์ ์ ์ด์ ๋ฐฉ๋ฌธ
for(Edge e : graph[minVertex]) {
// ๋ฐฉ๋ฌธ ์ํ ์ ์ ์ค, ๊ฑฐ๋ฆฌ ๋น๊ต(D ๋ฐฐ์ด์ ๊ธฐ์กด์ ์ ์ฅ๋ ๊ฑฐ๋ฆฌ vs ํ์ฌ ์ ์ ๊ฑฐ์น ๊ฑฐ๋ฆฌ)
if (!visited[e.adjvertex]) {
int currentDist = D[e.adjvertex];
int newDist = D[minVertex] + e.weight;
if(newDist < currentDist) {
D[e.adjvertex] = newDist;
previous[e.adjvertex] = minVertex;
}
}
}
}
return D;
}
}
์์ Prim ์๊ณ ๋ฆฌ์ฆ์ ์ดํดํ๋ค๋ฉด, ์ต์ํ๊ณ ์ด๋ ต์ง ์์ ์ฝ๋์ผ ๊ฒ์ด๋ค.
Dijkstra ์๊ณ ๋ฆฌ์ฆ์ ์ํ์๊ฐ
Dijkstra ์๊ณ ๋ฆฌ์ฆ์ n๋ฒ ๋ฐ๋ณต์ ๊ฑฐ์ณ์ minVertex ๊ฐ์ ์ฐพ๊ณ , ๊ฐ minVertex์ ์ธ์ ํ๋ฉด์ ๋ฐฉ๋ฌธ๋์ง ์์ ์ ์ ์ ๋ํ์ฌ ๊ฐ์ ์ํ๋ฅผ ์๋ํ๋ค. ์ฌ๊ธฐ์ minVertex๋ฅผ ์ฐพ๋ ์๊ฐ O(n), ๊ทธ๋ฆฌ๊ณ D์ ์์๋ฅผ ๊ฐฑ์ ํ๋ ์๊ฐ O(n) ์๊ฐ์ด๋ค.
๋ฐ๋ผ์ ์ด ์ํ ์๊ฐ์ n * (O(n) + O(n)) = O(n^2) ์ด๋ค.
Dijkstra ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ฐ์ ์ผ๋ก Prim ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ตฌํ๋ฐฉ๋ฒ์ด ๋น์ทํ๋ฉฐ ์ํ ์๊ฐ๋ ๊ฐ๋ค. ์ฆ, ์ด์ง ํ๊ณผ ํผ๋ณด๋์น ํ์ ์ฌ์ฉํ ๋๋ ๋์ผํ ์ํ์๊ฐ์ ๊ฐ์ง๋ค.
Bellman-Ford ์๊ณ ๋ฆฌ์ฆ
Dijkstra ์๊ณ ๋ฆฌ์ฆ์ ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง ๊ทธ๋ํ์์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ์์๋ค. Bellman-Ford ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ค๋ค. ์ด๋ ์์ ๊ฐ์ค์น ๊ทธ๋ํ ๋ด์์๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌํ ๊ณผ์ ์ด ๊ฐ๋ฅํ ์ด์ ๋ ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์์ ๊ฐ์ค์น ๊ฐ์ด ๊ฐ์ฅ ์์ ์ ์ ์ ์ ํํ๋ Dijkstra์ ๋ค๋ฅด๊ฒ ๋์๋์์ด๋ค.
Belleman-Ford ์๊ณ ๋ฆฌ์ฆ์ ๋งค ๋จ๊ณ๋ง๋ค ๋ชจ๋ ๊ฐ์ ์ ์ ๋ถ ํ์ธํ๋ค. ์ด์ ์ Dijkstra ์๊ณ ๋ฆฌ์ฆ์ ํ๋ฒ ์๊ฐํด๋ณด์. ์ด๊ธฐ์ ์ธ์ ํ ๋ ธ๋ ์ค ๊ฐ์ค์น์ ๊ฐ์ด ๊ฐ์ฅ ์์ ์ ์ ์ผ๋ก ์ด๋ํ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ํ ์ ์ ์์๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์ ์ ์ ์ ์ ์ธํ๊ณ D ์์๋ฅผ ์ ๋ฐ์ดํธ ํด์ฃผ์๋ค. ๊ทธ๋ฌ๋ Bellman-Ford๋ ๋ค๋ฅด๋ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์ ์ ์ ์ ์ ์ธํ์ง ์๊ณ , ๋๊ฐ์ด D์์๋ฅผ ์ ๋ฐ์ดํธ ํด์ฃผ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ ๊ฒ์ด๋ค.
๋จ, ์ ๋ ฅ ๊ทธ๋ํ์ ์ฌ์ดํด ์์ ๊ฐ์ ๋ค์ ๊ฐ์ค์น ํฉ์ด 0๋ณด๋ค ์์ ์์ ์ฌ์ดํด์ด ์์ด์ผ ํ๋ค. ๋ง์ฝ ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ฉด, ์์ ์ฌ์ดํด์ ๋ฐ๋ณตํ ์๋ก ๊ธธ์ด๊ฐ ๋ ์งง์์ง๋ ๋ชจ์์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Bellman-Ford ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ
public class Main {
public static final int INF = Integer.MAX_VALUE;
public static void main(String[] args) {
int[][] weight = {
{ INF, 1, INF, 2, INF, INF, INF, INF},
{ INF, INF, 4, -2, INF, 6, INF, INF},
{ INF, INF, INF, INF, INF, INF, INF, 2},
{ INF, INF, INF, INF, -1, INF, INF, INF},
{ INF, INF, INF, INF, INF, INF, 4, INF},
{ INF, INF, 1, INF, INF, INF, INF, INF},
{ INF, INF, -1, INF, INF, INF, INF, 1},
{ INF, INF, INF, INF, INF, 3, INF, INF}
};
int N = weight.length;
int s = 0;
BellmanFord bf = new BellmanFord(N);
bf.shortestPath(s, weight);
bf.printPaths(s);
}
}
class BellmanFord {
public static final int INF = Integer.MAX_VALUE;
private int D[];
private int previous[];
private int N;
// ์ด๊ธฐํ
public BellmanFord(int numOfVertices) {
N = numOfVertices;
D = new int[N];
previous = new int[N];
}
// ์ต์ ๊ฒฝ๋ก ํ์
public void shortestPath(int s, int adjMatrix[][]) {
// D ๊ฐ ์ด๊ธฐํ
for(int i=0; i<N; i++) {
D[i] = INF;
}
// s ์ ์ ๋ฐฉ๋ฌธ
D[s] = 0; previous[s] = 0;
// N-1๋ฒ(๊ฐ์ ์ ๊ฐฏ์) ๋ฐ๋ณต
for(int k=0; k<N-1; k++) {
// ๊ฐ์ ํ์(์ธ์ ํ๋ ฌ)
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if (adjMatrix[i][j] != INF) {
// D[j]๋ J์ ์ ์์์ ๊ธฐ์กด์ ๊ฐ์ค์น, D[i] + adjMatrix[i][j]๋ I ์ ์ ์ ๊ฑฐ์น ๊ฐ์ค์น
if (D[j] > D[i] + adjMatrix[i][j]) {
D[j] = D[i] + adjMatrix[i][j];
previous[j] = i;
}
}
}
}
}
}
public void printPaths(int s) {
System.out.println("์ ์ " + s + "์ผ๋ก๋ถํฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ");
for (int i = 0; i < N; i++) {
if (D[i] == INF)
System.out.println(s + "๊ณผ " + i + " ์ฌ์ด์ ๊ฒฝ๋ก ์์");
else
System.out.println("[" + s + ", " + i + "] " + D[i]);
}
System.out.printf("\n์ ์ " + s + "์ผ๋ก๋ถํฐ์ ์ต๋จ ๊ฒฝ๋ก\n");
for (int i = 0; i < N; i++) {
if (i != s) {
int back = i;
System.out.print(back);
while (back != s) {
System.out.print(" <- " + previous[back]);
back = previous[back];
}
System.out.println();
}
}
}
}
์คํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
Bellman-Ford ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์๊ฐ
Bellman-Ford ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ํ์ ์ธ์ ํ๋ ฌ์ ์ฌ์ฉํ์ฌ n-1๋ฒ์ ๋ฐ๋ณต์ ํตํด D[j]๋ฅผ ๊ณ์ฐํ๋ฏ๋ก, ์ํ ์๊ฐ์ (n-1) * x * O(n) = O(n^3)
์ฌ๊ธฐ์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ฉด (n-1) * O(m) = O(nm)์ด ๋๋ค.
Floyd-Warshall ์๊ณ ๋ฆฌ์ฆ
Floyd-Warshall ์๊ณ ๋ฆฌ์ฆ์ ์ด์ ์ ๋ฐฐ์ ๋, Dijkstra ์๊ณ ๋ฆฌ์ฆ์ด๋, Bellman-Ford ์ฒ๋ผ ํ ์ ์ ์์ ํน์ ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๋๋ค.
Floyd-Warshall ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ์ ์ ์ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ฆ, ๋ชจ๋ ์ง์ ์์ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ ํ ์ ์๋ค.(All Pairs Shortest Paths)
๋ชจ๋ ์์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ธฐ ์ํด์ ์ถ๋ฐ์ ์ 0์์ n-1๊น์ง ๋ฐ๊พธ์ด๊ฐ๋ฉฐ, Dijkstra ์๊ณ ๋ฆฌ์ฆ์ ์ํํ๋ ๊ฒ์ผ๋ก ๋ชจ๋ ์์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์๋ ์๋ค. ์ด ๊ณผ์ ์์ ๋ง์ฝ ์ธ์ ํ๋ ฌ์ ์ฌ์ฉํ๋ค๋ฉด, ์ํ ์๊ฐ์ O(n^3)๋งํผ ๊ฑธ๋ฆฐ๋ค. ํ์ง๋ง Dijkstra ์๊ณ ๋ฆฌ์ฆ์ ๋นํด ๊ฐ๋จํ๋ฉฐ, ์์ ๊ฐ์ค์น ๊ทธ๋ํ์์๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์ ์๋ค.
Dijkstra ์๊ณ ๋ฆฌ์ฆ์์ ๊ฐ์ ์ํ๋ฅผ ํ๋ ๋ถ๋ถ์ ํ๋ฒ ๋ ์ฌ๋ ค ๋ณด์. ํด๋น ๋ถ๋ถ์์ ์ฐ๋ฆฌ๋ ๋ฐฉ๋ฌธํ ์ ์ ์ ์ธ์ ํ ์ ์ ์ ๊ณ์ํด์ ์ ๋ฐ์ดํธ ํด์ฃผ์๋ค. Floyd-Warshall์์๋ ์ด ๊ณผ์ ์ ์ถ๋ฐ์ ์ ๋ฐ๊ฟ ๋๋ง๋ค ๋งค๋ฒ ์ํํด ์ฃผ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด, ๊ฒฐ๊ตญ ๋ง์ง๋ง ์ถ๋ฐ์ ์ ์ ์์ ๊ฐ์ ์ํ๋ฅผ ์ํํ์ ๋ ์ต์ ์ ๊ฒฝ๋ก ๋ฐฐ์ด์ ์ฐพ์ ์ ์์ ๊ฒ์ด๋ค.
Floyd-Warshall ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ
public class FloydWarshallAlgorithm {
public static void main(String[] args) {
int n = 4; // ๋
ธ๋ ์
int[][] adjmatrix = {
{0, 3, Integer.MAX_VALUE, 7},
{8, 0, 2, Integer.MAX_VALUE},
{5, Integer.MAX_VALUE, 0, 1},
{2, Integer.MAX_VALUE, Integer.MAX_VALUE, 0}
};
int[][] D = new int[n][n];
// ์ด๊ธฐํ ๋จ๊ณ
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
D[i][j] = adjmatrix[i][j];
}
}
// ๊ฐ์ ์ํ ๋จ๊ณ
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (D[i][j] > D[i][k] + D[k][j]) {
D[i][j] = D[i][k] + D[k][j];
}
}
}
}
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
System.out.println("๋ชจ๋ ๋
ธ๋ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (D[i][j] == Integer.MAX_VALUE) {
System.out.print("INF\t");
} else {
System.out.print(D[i][j] + "\t");
}
}
System.out.println();
}
}
}
Floyd-Warshall ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์๊ฐ
๋ฐฐ์ด ๋ณต์ฌ์ ์์ด O(n^2)์ด ์์๋๋ฉฐ, for-๋ฃจํ๊ฐ 3๊ฐ๊ฐ ์ค์ฒฉ๋๋ฏ๋ก O(n^3)์ด๋ค.
์ฆ, ์ด ์ํ ์๊ฐ์ O(n^2) + O(n^3) = O(n^3)
Reference
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ์ด๋? | c++ ๋ค์ต์คํธ๋ผ ๊ตฌํ
๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ์ด๋? ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ํ ์์์ ์์ ์ ์ ๋ถํฐ ๋๋จธ์ง ๊ฐ ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ํ์ ์ด๋ ๊ฐ์
code-lab1.tistory.com
[์๊ณ ๋ฆฌ์ฆ] ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ (Floyd-Warshall Algorithm)
์ง๋ ํฌ์คํ ์์๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์ฑํ์๋ค. ๋ค์ต์คํธ๋ผ์ ๊ฒฝ์ฐ ํ ์ง์ ์์ ๋ค๋ฅธ ํน์ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น
velog.io