V๊ฐ์ ์ ์ ๊ณผ E๊ฐ์ ๊ฐ์ ์ ๊ฐ์ง ๊ฐ์ค ๊ทธ๋ํ G์์ ๋ชจ๋ ์ ์ ์ฌ์ด์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก (๋ชจ๋ ๋ ธ๋ ๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ) ์์ ์ฌ์ดํด์ด ์๋ ๊ทธ๋ํ ๋ด์ ๊ฐ ๋ชจ๋ ์ ์ ์์ ๊ฐ ๋ชจ๋ ์ ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋๋ฐ ์ฌ์ฉ๋๋ค. ์์์ธ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ฐ์ ์ด ์กด์ฌํด๋ ๋๋ค.
์ด๋ค ๋ ์ ์ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ ์ด๋ค ๊ฒฝ์ ์ง(K)๋ฅผ ๊ฑฐ์น๊ฑฐ๋ ๊ฑฐ์น์ง ์๋ ๊ฒฝ๋ก ์ค ํ๋์ด๋ค.
ex). ์ ์ A์ ์ ์ B ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก = A-B ๋๋ A-K-B
๋ง์ฝ, ๊ฒฝ์ ์ง๋ฅผ ๊ฑฐ์น๋ค๋ฉด ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ด๋ฃจ๋ ๋ถ๋ถ ๊ฒฝ๋ก ๋ํ ์ต๋จ ๊ฒฝ๋ก์ด๋ค.
ex). A-K์ K-B ๋ํ ์ต๋จ๊ฒฝ๋ก
๐ ํน์ง
- ์ํ๋ง ์๋ค๋ฉด ์์ ๊ฐ์ค์น๋ ๊ฐ๋ฅํ๋ค
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ ๊ณํ๋ฒ(DP)์ผ๋ก ์ ๊ทผํ๋ค.
- โ๏ธ ์๊ฐ๋ณต์ก๋ : θ(V³) (V๋ ๋ ธ๋์ ์) โก๏ธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋ ธ๋์ ์๊ฐ ์ ์ ๋ ์ฌ์ฉํด์ผ ํจ.
๐น๏ธ ํ๋ก์ด๋ ์์ ๊ณผ์
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(DP) ๊ธฐ๋ฒ์ผ๋ก ์ ๊ทผํ๊ณ ์ธ์ ํ๋ ฌ์ ์ด์ฉํ์ฌ ๊ฐ ๋ ธ๋ ๊ฐ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ค.
๋ชจ๋ ๋ ธ๋์์ ๋ชจ๋ ๋ ธ๋๋ก ๊ฐ๋ ์ต์ ๋น์ฉ์ ๋จ๊ณ์ ์ผ๋ก ๊ฐฑ์ ํ๋ฉด์ ์งํ๋๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ ธ๋์์ ๋ ธ๋๋ก ๊ฐ๋ ๊ฐ์ ์ ๊ฐ์๊ฐ 0๊ฐ๋ถํฐ ์์ํด์ N๊ฐ(์ด ๋ ธ๋์ ๊ฐ์)๊น์ง ๋ชจ๋ ๊ณ ๋ คํด์ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ค.
1๏ธโฃ 0๊ฐ์ ๊ฐ์ ์ ๊ฑฐ์ณ์ ๋ชจ๋ ๋ ธ๋์์ ๋ชจ๋ ๋ ธ๋๋ก ๊ฐ๋ ๊ฒฝ์ฐ
: ์๊ธฐ ์์ ์์ ์๊ธฐ ์์ ์ ๋ ธ๋๋ก ๊ฐ๋ ๊ฒฝ์ฐ๋ฟ์ด๋ค. ์ด๊ธฐ ์ธ์ ํ๋ ฌ์ ๊ฐ์ ์๊ธฐ ์์ ์์ ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๊ฒฝ์ฐ(=0)๋ฅผ ์ ์ธํ๊ณ ๋ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋ก ๋ชจ๋ ๋งค์ฐ ํฐ๊ฐ์ผ๋ก ์ด๊ธฐํ(INF)ํ๋ค.
2๏ธโฃ 1๊ฐ์ ๊ฐ์ ์ ๊ฑฐ์ณ์ ๋ชจ๋ ๋ ธ๋์์ ๋ ธ๋๋ก ๊ฐ๋ ๊ฒฝ์ฐ
: ๋ ธ๋์์ ๋ ธ๋๋ก ๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ์ฌ๋ฌ๊ฐ์ง์ธ ๊ฒฝ์ฐ ๊ฐ์ ์ค์์ ์ต์๋น์ฉ์ ์ ํํ๋ค.
3๏ธโฃ 2๊ฐ์ ๊ฐ์ ์ ๊ฑฐ์ณ์ ๋ชจ๋ ๋ ธ๋์์ ๋ ธ๋๋ก ๊ฐ๋ ๊ฒฝ์ฐ โก๏ธ ํน์ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ์ ํด๋น ๋ ธ๋์ ๊ฐ๋ค.
: 2 โก๏ธ 0 โก๏ธ 0 ์ผ ๋ ์ต์ ๋น์ฉ = 7
2 โก๏ธ 0 โก๏ธ 1 ์ผ ๋ ์ต์ ๋น์ฉ = 3 (12์ด์ง๋ง, 3์ด ์ต์์ด๋ฏ๋ก ๊ฐฑ์ X)
2 โก๏ธ 0 โก๏ธ 2 ์ผ ๋ ์ต์ ๋น์ฉ = 0 (14์ด์ง๋ง, 0์ด ์ต์์ด๋ฏ๋ก ๊ฐฑ์ X)
2 โก๏ธ 0 โก๏ธ 3 ์ผ ๋ ์ต์ ๋น์ฉ = 9 (10์ด์์ผ๋, 9๊ฐ ์ต์์ด๋ฏ๋ก ๊ฐฑ์ !)
2 โก๏ธ 0 โก๏ธ 4 ์ผ ๋ ์ต์ ๋น์ฉ = 8 (INF์ด์์ผ๋, 8์ด ์ต์์ด๋ฏ๋ก ๊ฐฑ์ !)
๐ก ๊ฐ์ 0๊ฐ ~ N๊ฐ๋ฅผ ๊ฑฐ์ณ์ ํด๋น ๋ ธ๋๋ก ๊ฐ๋ ๋น์ฉ ์ค ์ต์๊ฐ ๋ชจ๋ ๊ณ ๋ ค ๊ฐ๋ฅ
๐ฉ๐ป ํ๋ก์ด๋ ์์ ์ฝ๋ ๊ตฌํ
public class FloydWarshall{
static int N, M;
static int[][] dist;
static int INF = 100000000;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
dist = new int[N][N];
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
if(i==j){
dist[i][j] = 0;
continue;
}
dist[i][j] = INF;
}
}
for(int i=0; i<M; i++){
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int cost = Integer.parseInt(st.nextToken());
// ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ํ๋๊ฐ ์๋ ์ ์์ผ๋ฏ๋ก ์ต์ ๋น์ฉ์ ์ ์ฅ
dist[a][b] = Math.min(dist[a][b], cost);
dist[b][a] = Math.min(dist[b][a], cost);
}
// ํ๋ก์ด๋ ์์
์๊ณ ๋ฆฌ์ฆ
// ๋
ธ๋๋ฅผ 1๊ฐ๋ถํฐ N๊ฐ๊น์ง ๊ฑฐ์ณ๊ฐ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ณ ๋ ค
for(int k=0; k<N; k++){
// ๋
ธ๋ i์์ j๋ก ๊ฐ๋ ๊ฒฝ์ฐ
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
// k๋ฒ์งธ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ๊ฐ๋ ๋น์ฉ์ด ๊ธฐ์กด ๋น์ฉ๋ณด๋ค ๋ ์์ ๊ฒฝ์ฐ ๊ฐฑ์
// ๋๋ ์ฐ๊ฒฐ์ด ์๋์ด์๋ ๊ฒฝ์ฐ(INF) ์ฐ๊ฒฐ ๋น์ฉ ๊ฐฑ์ .
dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
}
}
'์๊ณ ๋ฆฌ์ฆ > ๐๏ธ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Bellman-Ford (๋ฒจ๋ง-ํฌ๋) (0) | 2023.09.08 |
---|---|
LCA (์ต์๊ณตํต์กฐ์) (0) | 2023.09.04 |
Binary Search (์ด๋ถํ์) (0) | 2023.09.01 |
Union Find (์ ๋์จ ํ์ธ๋) (0) | 2023.08.29 |
Dijkstra (๋ค์ต์คํธ๋ผ) (0) | 2023.03.03 |