๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์ ์ต๋จ๊ฑฐ๋ฆฌ ๋ฌธ์ ๋ ๋๋ถ๋ถ BFS๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค. ํ์ง๋ง, ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ์กด์ฌํ๋ค๋ฉด BFS๊ฐ ์๋ ์ต๋จ๊ฑฐ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์ ๊ทผํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ค์น ๊ทธ๋ํ์ ์ต๋จ๊ฑฐ๋ฆฌ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ์ด ์กด์ฌํฉ๋๋ค.
- ๋ ์ ์ ๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์
- ํ๋์ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊ณผ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์
- ํ๋์ ์ ์ ์ผ๋ก ๊ฐ๋ ๋ชจ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์
- ์ ์ ๊ฐ์ ๋ชจ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์
์ด ์ค 4๋ฒ์ ํด๊ฒฐํ๊ธฐ ์ํ ํ๋ก์ด๋-์์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์๋ณด๊ณ ์ ํฉ๋๋ค.
ํ๋ก์ด๋ ์์ฌ ์๊ณ ๋ฆฌ์ฆ
ํ๋ก์ด๋ ์์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ์ ์ ๊ฐ์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์์ผ๋ก์ ์ค๋ช ์์ ์ฌ์ฉ๋ ๊ทธ๋ํ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ด๊ธฐ ๊ฐ์ค์น ๊ฐ์ ์ ์ฅํ๋ ์ธ์ ํ๋ ฌ(D)์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๊ธฐ ์ธ์ ํ๋ ฌ์ ์ต๋จ ๊ฒฝ๋ก ํ๋ ฌ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ์ค๋ช ํด ๋ณด๋ฉด K๋ฒ์งธ ๋ ธ๋๋ฅผ ์ถ๊ฐํ์ ๋, ์ ์ i์์ j๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ ๊ธฐ์กด์ i ⇒ j์ ๊ฑฐ๋ฆฌ์ ์ค๊ฐ์ k๋ฅผ ๊ฑฐ์ณ๊ฐ๋ ๊ฑฐ๋ฆฌ ์ค ์งง์ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋๋ค.
์์ ์ ํ์์ ํตํด ์ ์ i,j ๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ์๋ ์์ง๋ง, ์ด๋ค ์ ์ ์ ๊ฑฐ์น๋์ง ๊ฒฝ๋ก๋ฅผ ์ ์๋ ์์ต๋๋ค. ์ด๋ฅผ ์์์๋ ์ง์ ์ ์ ํ๋ ฌ(P)์ ์ ์งํด์ผํฉ๋๋ค. ์ง์ ์ ์ ํ๋ ฌ์ด๋ i ์ ์ ์์ j ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก์์ j ์ ์ ์ง์ ์ ์์นํ๋ ์ ์ ์ ์ ์ฅํ๋ ํ๋ ฌ์ ์๋ฏธํฉ๋๋ค.
์ด๊ธฐ ์ง์ ์ ์ ํ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ธ์ ํ๋ ฌ์ ๊ฐฑ์ ํ๋ฉด์ i,j์ ์ ์ ์ฌ์ด์์ k๋ฅผ ๊ฑฐ์ณ ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์ต๋จ ๊ฒฝ๋ก๋ผ๋ฉด P(i,j)๋ฅผ k๋ก ๊ฐฑ์ ํด์ฃผ๋ฉด ๋ชจ๋ ์ ์ ์ด ์ถ๊ฐ๋ ์ดํ ์ต๋จ ๊ฒฝ๋ก์ ์ํ๋ ์ ์ ์ ๊ตฌํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ดํ ์ฝ๋์ ์กด์ฌํฉ๋๋ค.
Java ๊ตฌํ
์๋ฐ๋ก ๊ตฌํํ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. Input์ ๋ฐฑ์ค ํ๋ก์ด๋ ๋ฌธ์ ์ ๋์ผํ๊ฒ ์์ ๊ทธ๋ํ๋ฅผ (start, destination, weight) ํํ๋ก ๋ฐ๋ ์ํฉ์ผ๋ก ์ค์ ํ์์ต๋๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Blog {
static final int INF = 99999;
static final int NIL = -1;
static int[][] D = new int[6][6];
static int[][] P = new int[6][6];
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
// Initialize
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
P[i][j] = NIL;
D[i][j] = INF;
}
}
// process input
for (int i = 0; i < 8; i++) {
String[] line = br.readLine().split(" ");
int start = Integer.parseInt(line[0]);
int dest = Integer.parseInt(line[1]);
int weight = Integer.parseInt(line[2]);
D[start][dest] = weight;
P[start][dest] = start;
}
floydWarshall();
}
public static void floydWarshall() {
for (int k = 1; k <= 5; k++) {
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5; j++) {
if (D[i][j] <= D[i][k] + D[k][j]) continue;
D[i][j] = D[i][k] + D[k][j];
P[i][j] = k;
}
}
}
}
}
ํด๋น ์ฝ๋๋ฅผ ํตํด ์ป์ ์ธ์ ํ๋ ฌ๊ณผ ์ง์ ์ ์ ํ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Input
=================
1 2 3
1 4 4
2 3 7
2 5 5
4 2 2
4 5 2
5 1 1
5 3 3
Init
======= D ========
INF 3 INF 4 INF
INF INF 7 INF 5
INF INF INF INF INF
INF 2 INF INF 2
1 INF 3 INF INF
======= P ========
-1 1 -1 1 -1
-1 -1 2 -1 2
-1 -1 -1 -1 -1
-1 4 -1 -1 4
5 -1 5 -1 -1
Add :1
======= D ========
INF 3 INF 4 INF
INF INF 7 INF 5
INF INF INF INF INF
INF 2 INF INF 2
1 4 3 5 INF
======= P ========
-1 1 -1 1 -1
-1 -1 2 -1 2
-1 -1 -1 -1 -1
-1 4 -1 -1 4
5 1 5 1 -1
Add :2
======= D ========
INF 3 10 4 8
INF INF 7 INF 5
INF INF INF INF INF
INF 2 9 INF 2
1 4 3 5 9
======= P ========
-1 1 2 1 2
-1 -1 2 -1 2
-1 -1 -1 -1 -1
-1 4 2 -1 4
5 1 5 1 2
Add :3
======= D ========
INF 3 10 4 8
INF INF 7 INF 5
INF INF INF INF INF
INF 2 9 INF 2
1 4 3 5 9
======= P ========
-1 1 2 1 2
-1 -1 2 -1 2
-1 -1 -1 -1 -1
-1 4 2 -1 4
5 1 5 1 2
Add :4
======= D ========
INF 3 10 4 6
INF INF 7 INF 5
INF INF INF INF INF
INF 2 9 INF 2
1 4 3 5 7
======= P ========
-1 1 2 1 4
-1 -1 2 -1 2
-1 -1 -1 -1 -1
-1 4 2 -1 4
5 1 5 1 4
Add :5
======= D ========
7 3 9 4 6
6 9 7 10 5
INF INF INF INF INF
3 2 5 7 2
1 4 3 5 7
======= P ========
5 1 5 1 4
5 5 2 5 2
-1 -1 -1 -1 -1
5 4 5 5 4
5 1 5 1 4
์ต๋จ ๊ฒฝ๋ก์ ํด๋นํ๋ ์ ์ ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ P[start][end]์ ๊ฐ(์ง์ ์ ์ )์ด start์ ๊ฐ์์ง ๋ ๊น์ง ๊ฐ์ ์ฐพ์๊ฐ๋ ๋ฐฉ๋ฒ์ ํตํด ๊ตฌํ ์ ์์ต๋๋ค.. 1 → 3์ ์์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- P[1][3] = 5
- P[1][5] = 4
- P[1][4] = 1
์ด ๋ ์ต์ข ๊ฒฝ๋ก๋ 1 ⇒ 4 ⇒ 5 ⇒ 3์ด ๋ฉ๋๋ค. ํด๋น ๊ณผ์ ์ Java ์ฝ๋๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
static void printPath(int start, int end) {
Stack<Integer> path = new Stack<>();
while(true) {
path.add(end);
if (P[start][end] == start) {
path.add(start);
break;
}
end = P[start][end];
}
while(!path.isEmpty())
System.out.print(path.pop());
}
'๐ Algorithm > ๐ ๊ฐ๋ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ฐ๋ ์ ๋ฆฌ] ํฌ ํฌ์ธํฐ (0) | 2021.04.01 |
---|---|
[๊ฐ๋ ์ ๋ฆฌ] ์ต๋จ ๊ฑฐ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ - ๋ค์ต์คํธ๋ผ (0) | 2021.03.22 |
[๊ฐ๋ ์ ๋ฆฌ] ์ค์ํ ์๊ณ ๋ฆฌ์ฆ (0) | 2021.02.26 |
[๊ฐ๋ ์ ๋ฆฌ] ์์ด, ์กฐํฉ, ๋ถ๋ถ์งํฉ (0) | 2021.02.19 |
๋๊ธ