๋ฌธ์ (Gold 2)
https://www.acmicpc.net/problem/11780
ํ์ด
๋ชจ๋ ๊ฒฝ๋ก์ ๋ํ ์ต์ ๋น์ฉ์ ๊ตฌํด์ผ ํ๋ฏ๋ก 'ํ๋ก์ด๋-์์ฌ ์๊ณ ๋ฆฌ์ฆ' ์ฌ์ฉ!
์ต์ ๋น์ฉ ์ธ, ๊ฒฝ๋ก์ ๋ํ ๋ด์ฉ๋ ์ ์ฅํด์ผ ํ๋ฏ๋ก ์ด์ฐจ์๋ฐฐ์ด ๋ณ์ ํ๋ ๋ ์ ์ธ
map[i][j]: i -> j ๊ฒฝ๋ก์ ์ต์ ๋น์ฉ ์ ์ฅ
path[i][j]: i์์ ์ถ๋ฐํด์ j๊น์ง ๋์ฐฉํ๊ธฐ ์ง์ ์ ๋ค๋ฅด๋ ๋์
๋ฐ๋ก ์ค๋ ๊ธธ(map[i][j])๋ณด๋ค ๊ฒฝ๋ก k๋ฅผ ๊ฑฐ์ณ์ ์ค๋ ๊ธธ(map[i][k] + map[k][j])์ด ๋ ๋น ๋ฅผ ๊ฒฝ์ฐ,
์ต์ ๋น์ฉ ์ ์ฅ ๋ฐ ๋์ฐฉ์ j๋ก ๊ฐ๊ธฐ ์ ์ ๋ค๋ฅธ ๊ณณ ์ ์ฅ!
๊ฒฝ๋ก i -> j๊ฐ i->k->j๊ฐ ๋์์ผ๋ฏ๋ก, path[i][j]๋ j์ ๋์ฐฉํ๊ธฐ ์ง์ ๋ค๋ฅธ ๊ณณ์ธ path[k][j]๋ก ์ ์ฅ
๊ฒฝ๋ก ์ถ๋ ฅ ๋ก์ง
i->j ๊ฒฝ๋ก๋ผ๊ณ ํ ๊ฒฝ์ฐ,
j์ ์ ๋ค๋ ธ๋ ๊ณณ์ ๊ณ์ํด์ ํ๊ณ ๊ฐ์ i๋ฅผ ๋ง๋ ๋๊น์ง ์คํ์ ๋ฃ์ผ๋ฉฐ ๋ฐ๋ณตํ๋ ๋ก์ง
=> ๋ง์ง๋ง ๋์ฐฉ์ ๋ถํฐ ์์์ ๊น์ง ํ๊ณ ๊ฑฐ๊พธ๋ก ํ๊ณ ๊ฐ
์ฝ๋
package shortestPath;
import java.util.*;
import java.io.*;
public class Main_11780_ํ๋ก์ด๋ {
static final int INF = 10000001;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
int[][] map = new int[n+1][n+1]; // ์ต๋จ๊ฒฝ๋ก ์ ์ฅ
int[][] path = new int[n+1][n+1]; // ๋์ฐฉ์ ์ผ๋ก ๊ฐ๊ธฐ ์ง์ ์ ๋ค๋ฆฐ ์ ์ ์ฅ
for(int i = 0 ; i < n+1 ; i++){
for(int j = 0 ; j < n + 1 ; j++){
if(i == j){
map[i][j] = 0;
path[i][j] = INF;
}else{
map[i][j] = INF;
path[i][j] = INF;
}
}
}
for(int i = 0 ; i < m ; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
int cost = Integer.parseInt(st.nextToken());
map[start][end] = Math.min(map[start][end], cost); // ์ด๋ฏธ ์ ์ฅ๋์ด ์์ ์ง ๋ชจ๋ฅด๋๊น, ์ต์๊ฐ ์ ์ฅ
path[start][end] = start;
}
for(int k =1 ; k < n+1 ; k ++){
for(int i = 1; i < n+1 ; i++){
for(int j = 1 ; j < n+1 ; j++){
if(i!=j && map[i][j] > map[i][k] + map[k][j]){ // ๋ฐ๋ก ์ค๋ ๊ธธ(map[i][j])๋ณด๋ค ๊ฒฝ๋ก k๋ฅผ ๊ฑฐ์ณ์ ์ค๋ ๊ธธ(map[i][k] + map[k][j])์ด ๋ ๋น ๋ฅผ ๊ฒฝ์ฐ
map[i][j] = map[i][k] + map[k][j]; // ์ต์ ๋น์ฉ ์ ์ฅ
path[i][j] = path[k][j]; // ๋์ฐฉ์ j๋ก ๊ฐ๊ธฐ ์ ์, ๋ค๋ฅธ ๊ณณ(path[k][j]) ์ ์ฅ
}
}
}
}
for(int i = 1 ; i < n +1 ; i++){
for(int j = 1; j < n+1 ; j++){
sb.append(map[i][j]==INF ? 0+" " : map[i][j]+" "); // ์ต์ ๋น์ฉ ์ถ๋ ฅ
}
sb.append("\n");
}
Stack<Integer> stack = new Stack<>();
for(int i = 1 ; i < n+1 ; i++){
for(int j = 1 ; j < n+1 ; j++){
if(path[i][j] == INF) sb.append("0\n"); // ๊ฐ ์ ์๋ ๊ฒฝ์ฐ
else{
int end = j;
stack.push(end);
/*
i->j ๊ฒฝ๋ก๋ผ๊ณ ํ ๊ฒฝ์ฐ,
j์ ์ ๋ค๋ ธ๋ ๊ณณ์ ๊ณ์ํด์ ํ๊ณ ๊ฐ์
i๋ฅผ ๋ง๋ ๋๊น์ง ์คํ์ ๋ฃ์ผ๋ฉฐ ๋ฐ๋ณตํ๋ ๋ก์ง
=> ๋ง์ง๋ง ๋์ฐฉ์ ๋ถํฐ ์์์ ๊น์ง ํ๊ณ ๊ฑฐ๊พธ๋ก ํ๊ณ ๊ฐ
*/
while( i != path[i][end] ){
end = path[i][end];
stack.push(end);
}
stack.push(i); // ๋ง์ง๋ง์ธ ์์์ ๋ ์ถ๋ ฅํด์ผ ํ๋ฏ๋ก!
sb.append(stack.size());
while(!stack.isEmpty()){ // ์์์ ๋ถํฐ ๋ง์ง๋ง์ ๊น์ง ์ถ๋ ฅ(stack > FILO)
sb.append(" "+stack.pop());
}
sb.append("\n");
}
}
}
System.out.println(sb.toString());
}
}
'๐ ์๊ณ ๋ฆฌ์ฆ > ShortestPath' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LeetCode] 1091. Shortest Path in Binary Matrix (ํด์, Kotlin ํ์ด) (0) | 2023.06.19 |
---|---|
[๋ฐฑ์ค] 13549๋ฒ: ์จ๋ฐ๊ผญ์ง3 (0) | 2022.04.03 |
[๋ฐฑ์ค] 1238๋ฒ: ํํฐ (JAVA) (0) | 2022.04.03 |
[๋ฐฑ์ค] 16118๋ฒ ๋ฌ๋น์ฌ์ฐ (Java) (0) | 2022.02.08 |
[๋ฐฑ์ค] 1753๋ฒ ์ต๋จ๊ฒฝ๋ก (Java) (0) | 2021.08.24 |