์ค๋๋ง์ ํ๋ก์ด๋ ์์
์ ํ์ด๋ณด์๋ค.
๊ธฐ์ต ๋๋ ๊ฑด ์ผ์ค for๋ฌธ์ ๋๋ฉด์ ๊ฒฝ์ ์ง๋ฅผ ์ง์ ํ๊ณ , ๊ฐ์ฅ ์ต์์ ๊ฐ์ด ๋์ค๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ๋ ๊ฒ์ด์๋ค.
์ด ๊ธฐ์ต์ ๋์ง์ด ์๋์ ๊ฐ์ด ํ์๋ค.
1) ์ธ์ ๋ฆฌ์คํธ๋ก ๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅ
2) ์ผ์ค for๋ฌธ์ ๋๋ฉด์ ์ถ๋ฐ์ง, ๋์ฐฉ์ง, ๊ฒฝ์ ์ง๋ฅผ ์ง์ ํ๋ค.
3) getWeight ๋ฉ์๋๋ฅผ ์ด์ฉํด ๊ฒฝ์ ์ง๋ฅผ ๊ฑฐ์ณ์ ๊ฐ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค.
int path = getWieght(์ถ๋ฐ์ง, ๊ฒฝ์ ์ง) + getWeight(๊ฒฝ์ ์ง, ๋์ฐฉ์ง)
4) for๋ฌธ์ ๋๋ฉด์ ์ต์์ path ๊ฐ์ ๊ฐฑ์ ํ๋ค.
์ ๋ก์ง์ผ๋ก๋ ๋ต์ด ์ ๋์จ๋ค.๐ฟ
gemini์๊ฒ ๋ฌผ์ด๋ณด๋ ํ๋ก์ด๋ ์์
์ ์๋ชป ์ ๊ทผํ๋ค๊ณ ํ๋ค.
์ด์ฐธ์ ํ๋ก์ด๋ ์์ ์ ๋ค์ ์ ๋ฆฌํด๋ณด์
ํ๋ก์ด๋ ์์
์ ๊ทธ๋ํ์์ ๋ชจ๋ ๋
ธ๋ ์ ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง ๊ฐ์ ์ด ์์ ๋๋ ์ฌ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
์ค๊ฐ ๋ ธ๋(๊ฒฝ์ ์ง)๋ฅผ ํ์ฉํ๋ฉด์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ ์ง์ ์ผ๋ก ๊ฐ์
1. ์ผ์ค ๋ฐ๋ณต๋ฌธ
1) ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ : ๊ฒฝ์ ์ง ๋
ธ๋
2) ์ค๊ฐ : ์ถ๋ฐ ๋
ธ๋
3) ์์ชฝ : ๋์ฐฉ์
2. ์ ํ์
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j])
1) dist ๋ฐฐ์ด ์์ฑ ๋ฐ ์ด๊ธฐํ
// dist ๋ฐฐ์ด ์์ฑ
dist = new int[n + 1][n + 1];
// dist ๋ฐฐ์ด ์ด๊ธฐํ //์๊ธฐ ์์ ์ 0์ผ๋ก ๋๊ธฐ. ๋๋จธ์ง๋ ๋ฌดํ๋๋ก
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) {
dist[i][j] = 0;
} else {
dist[i][j] = INF;
}
}
}
2) ์ผ์ค for๋ฌธ์ผ๋ก ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ ๋๋ฆฌ๊ธฐ
// ํ๋ก์ด๋ ์์
์๊ณ ๋ฆฌ์ฆ (3์ค for๋ฌธ)
// k๋ ๊ฒฝ์ ๋
ธ๋
for (int k = 1; k <= n; k++) {
// i : ์ถ๋ฐ์ง์
for (int i = 1; i <= n; i++) {
// j : ๋์ฐฉ์ง์
for (int j = 1; j <= n; j++) {
// i์์ j๋ก ๊ฐ๋ ๊ธฐ์กด ๊ฒฝ๋ก์ k๋ฅผ ๊ฑฐ์ณ์ ๊ฐ๋ ๊ฒฝ๋ก ๋น๊ต
// ๊ฒฝ๋ก๊ฐ ์์ ๋ ์ํ
if (dist[i][k] != INF && dist[k][j] != INF) {
dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
}
1. ํ์ฌ๊น์ง ๊ณ์ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด(dist)์ ์ฌ์ฉํด์ผ ํ๋ค.
์ธ์ ๋ฆฌ์คํธ static List<Edge>[] graph๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํด์ผ ํ๋ค.
๋ด๊ฐ ๋ง๋ getWeight() ํจ์๋ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ด ์์ ๊ฒฝ์ฐ, ์ฒ์ ๋ง๋๋ ๊ฐ์ ํ๋๋ง ํ์ํ๋ค๋ ํ๊ณ๊ฐ ์๋ค.
2. ์ผ์ค for๋ฌธ์ ์์
๊ฒฝ์ ์ง > ์ถ๋ฐ์ง > ๋์ฐฉ์ง ์์ผ๋ก ํด์ผํ๋ค.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class backjoon_floyd_11404_Solution {
// ๋ฌธ์ ์ ๋น์ฉ์ ์ต๋ 100,000. ๋์ ๊ฐ์ n=100.
// ์ต๋ ๊ฒฝ๋ก ๋น์ฉ์ 100 * 100,000 = 10,000,000.
// ๋ฌดํ๋(INF) ๊ฐ์ ์ด๋ณด๋ค ์ปค์ผ ํฉ๋๋ค. int์ MAX_VALUE๋ ์ค๋ฒํ๋ก์ฐ ์ํ์ด ์์ต๋๋ค.
// 100,000,001 (1์ต) ์ ๋๋ก ์ค์ ํ๋ฉด ์ถฉ๋ถํฉ๋๋ค.
static final int INF = 100_000_001;
static int n;
static int[][] dist; // ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ 2์ฐจ์ ๋ฐฐ์ด
public static void main(String[] args) throws IOException {
// System.setIn(new FileInputStream("src/input.txt")); // ํ์ผ ์
๋ ฅ์ ํ
์คํธ์ฉ์ผ๋ก๋ง ์ฌ์ฉ
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
dist = new int[n + 1][n + 1];
// 1. dist ๋ฐฐ์ด ์ด๊ธฐํ: ์๊ธฐ ์์ ์ 0, ๋๋จธ์ง๋ INF
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) {
dist[i][j] = 0;
} else {
dist[i][j] = INF;
}
}
}
// 2. ๊ฐ์ ์ ๋ณด๋ก dist ๋ฐฐ์ด ์ฑ์ฐ๊ธฐ (์ง์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ค ์ต์ ๋น์ฉ ์ ํ)
for (int i = 0; i < m; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
// ๊ฐ์ ๋
ธ์ ์ด ์ฌ๋ฌ ๊ฐ ์ฃผ์ด์ง๋ฉด ๋ ์์ ๋น์ฉ์ผ๋ก ์ด๊ธฐํ
dist[from][to] = Math.min(dist[from][to], w);
}
// 3. ํ๋ก์ด๋-์์
์๊ณ ๋ฆฌ์ฆ ์คํ (์ผ์ค ๋ฐ๋ณต๋ฌธ)
// k: ์ค๊ฐ ์ง์ (๊ฒฝ์ ๋
ธ๋)
for (int k = 1; k <= n; k++) {
// i: ์ถ๋ฐ ์ง์
for (int i = 1; i <= n; i++) {
// j: ๋์ฐฉ ์ง์
for (int j = 1; j <= n; j++) {
// i์์ j๋ก ๊ฐ๋ ๊ธฐ์กด ๊ฒฝ๋ก์ i์์ k๋ฅผ ๊ฑฐ์ณ j๋ก ๊ฐ๋ ๊ฒฝ๋ก ๋น๊ต
if (dist[i][k] != INF && dist[k][j] != INF) {
dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
}
// 4. ๊ฒฐ๊ณผ ์ถ๋ ฅ
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
// ๊ฐ ์ ์๋ ๊ฒฝ์ฐ (INF)๋ 0์ผ๋ก ์ถ๋ ฅ
if (dist[i][j] == INF) {
sb.append(0).append(" ");
} else {
sb.append(dist[i][j]).append(" ");
}
}
sb.append("\n");
}
System.out.print(sb.toString());
}
}