[μκ³ λ¦¬μ¦] Floyd-Warshall νλ‘μ΄λ-μμ¬ μμ보기 ( λ°±μ€ 11404λ² κ²½λ‘ μ°ΎκΈ° with μλ° )

π€ Floyd-Warshall νλ‘μ΄λ-μμ¬ μκ³ λ¦¬μ¦?
κ·Έλνμ μλ λͺ¨λ μ μ μ λν΄ κ° μ μ λ€μ΄ λ€λ₯Έ μ μ λ€κΉμ§ λλ¬νκΈ° μν΄ νμν λͺ¨λ μ΅λ¨ 거리λ₯Ό ꡬν λ μ¬μ©ν©λλ€.
νλ‘μ΄λ-μμ¬ μκ³ λ¦¬μ¦μ κ±°μ³κ°λ μ μ μ κΈ°μ€μΌλ‘ μκ³ λ¦¬μ¦μ μννλ νΉμ§μ΄ μμ΅λλ€.
μ¦, μ μ A, μ μ B κΉμ§μ μ΅λ¨ 거리λ₯Ό ꡬνκΈ° μν΄ μ€κ°μμ κ±°μ³κ° μ μλ λͺ¨λ μ μ λ€μ νμΈν΄λ³΄κ³ κ·Έ μ€ μ΅λ¨ 거리μ κ²½λ‘λ₯Ό μ°Ύμ΅λλ€.
(νλ‘μ΄λ μμ¬μ λ€μ΄λλ―Ή νλ‘κ·Έλλ° κΈ°λ²μ μ¬μ©ν μκ³ λ¦¬μ¦μ΄κ³ , μΈμ νλ ¬λ‘ νννμ¬ μ΅λ¨ 거리λ₯Ό κ³μ°ν©λλ€.)
β μκ°λ³΅μ‘λ
3μ€ forλ¬Έμ ν΅ν΄ κ±°μ³κ°λ μ μ μ μ΄μ©νμ¬ κ·Έλνλ₯Ό νμνκΈ° λλ¬Έμ O(n^3)μ μκ°λ³΅μ‘λλ₯Ό κ°μ΅λλ€.
β νμ λ°©λ²
λ¬Έμ μ ν¨κ» νλ‘μ΄λ-μμ¬ μκ³ λ¦¬μ¦μ νμλ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€.
λμ΄λ : 골λ π₯
11404λ²: νλ‘μ΄λ
첫째 μ€μ λμμ κ°μ nμ΄ μ£Όμ΄μ§κ³ λμ§Έ μ€μλ λ²μ€μ κ°μ mμ΄ μ£Όμ΄μ§λ€. κ·Έλ¦¬κ³ μ μ§Έ μ€λΆν° m+2μ€κΉμ§ λ€μκ³Ό κ°μ λ²μ€μ μ λ³΄κ° μ£Όμ΄μ§λ€. λ¨Όμ μ²μμλ κ·Έ λ²μ€μ μΆλ° λμμ λ²νΈκ°
www.acmicpc.net



μ μμ λ₯Ό κ·Έλνλ‘ νννλ©΄ μμ κ·Έλ¦Όμ²λΌ ννν μ μμ΅λλ€.
κ° μ μ λ€μ λμμ΄κ³ νμ΄νμ μ«μλ λμμμ λ€λ₯Έ λμλ‘ κ°κΈ°μν λΉμ©μ λλ€.
λ¬Έμ λ λͺ¨λ λμμ μμ λν΄μ λμAμμ Bλ‘ κ°λλ° νμν μ΅μ λΉμ©μ ꡬν΄μΌ ν©λλ€.
νλ‘μ΄λ-μμ¬ μκ³ λ¦¬μ¦μ λͺ¨λ μ μ μ λν΄ κ° μ μ λ€μ΄ λ€λ₯Έ μ μ λ€κΉμ§ λλ¬νκΈ° μν΄ νμν λͺ¨λ μ΅λ¨ 거리λ₯Ό ꡬν λ μ¬μ©ν©λλ€.
μ¦, μ΄ λ¬Έμ νμ΄μ μ μ©ν΄λ³Ό μ μκ² μ΅λλ€.
κ° μ μ μμ λ€λ₯Έ μ μ κΉμ§μ μ΅μ λΉμ©μ μ΄μ°¨μ λ°°μ΄μ ννλ‘ νννλ©΄ μλμ κ°μ΄ ννν μ μμ΅λλ€.
( 0μ μκΈ° μμ (A, A)μ΄κΈ° λλ¬Έμ λΉμ©μ΄ 0μ μ λλ€, X λ μ°κ²°λμ§ μμ κ° μ μλ λΆλΆμ λλ€ )
0 | 2 | 3 | 1 | 10 |
X | 0 | X | 2 | X |
8 | X | 0 | 1 | 1 |
X | X | X | 0 | 3 |
7 | 4 | X | X | 0 |
int n = Integer.parseInt(br.readLine()); // 5 λμμ μ
int m = Integer.parseInt(br.readLine()); // 14 λμμ μ°κ²°λ κ²½λ‘μ μ
int x = 100000 * (n-1) + 1;
int[][] city = new int[n + 1][n + 1];
// μ΄κΈ° μ΄μ°¨μ λ°°μ΄ μ 체λ₯Ό xμ 0μμΈ λΆλΆμ 0μ΄ λλλ‘ μΈν
ν΄μ€λλ€.
for (int i = 1; i < city.length; i++) {
for( int j = 1; j<city[i].length; j++){
city[i][j] = x;
if( i == j ){
city[i][j] = 0;
}
}
}
// μ΅μ λΉμ©μ ꡬνκΈ° λλ¬Έμ κ°μ₯ μ μ λΉμ©μΌλ‘ μΈν
ν©λλ€.
// μ΄λ κ²κΉμ§ νλ©΄ μμ νμ²λΌ μ΄μ°¨μ λ°°μ΄μ μΈν
νμμ΅λλ€.
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());
city[a][b] = Math.min(city[a][b], cost);
}
π μ°κ²°λμ§ μμ Xμ κ° μ€μ
μ΅λκ°(무ν)μ μκ°ν΄μ Integer.MAX_VALUEλ₯Ό μ€μ ν΄ λ³΄μμ§λ§ λ€λ₯Έ κ²½λ‘μ λΉμ©κ³Ό ν©μ³μ§κ² λλ©΄ μμκ° λμ΄ μ€λ₯κ° λ°μν©λλ€ π
int x = 100000 * ( n - 1 ) + 1
λΉμ©(μ°κ²°λ κ°μ μ κ°μ€μΉ) μ μ΅λκ° * κ°μ μ μ(=λ
Έλμ μ - 1 ) λ³΄λ€ μ»€μΌνκΈ° λλ¬Έμ + 1
κ²½λ‘κ° μλ λΆλΆμ μ΅λκ°(무ν)μΌλ‘ μ€μ νλ μ΄μ λ μ€μ κ²½λ‘κ° μ‘΄μ¬νμ§ μμμ λνλ΄κΈ° μν¨μ
λλ€.
μλ₯Όλ€μ΄ 1->2->3->4->5 μ²λΌ λͺ¨λ κ²½λ‘λ₯Ό κ±°μ³μ λμ°©ν λΉμ©μ
λΉμ© * κ°μ μ μ λ‘ ννν μ μμ΅λλ€ νμ§λ§ λ§μ½ κ²½λ‘κ° μλ xκ° λͺ¨λ κ²½λ‘λ₯Ό κ±°μΉ λΉμ©λ³΄λ€ μλ€λ©΄ νλ‘μ΄λ-μμ¬ μκ³ λ¦¬μ¦μ κ²½λ‘κ° μλ xμ κ°μΌλ‘ λΉμ©μ μΈν
νκ²λμ΄ μκ³ λ¦¬μ¦μ μ€λ₯λ‘ μ΄μ΄μ§κ² λ©λλ€.
μΈν λ μ΄μ°¨μ λ°°μ΄μ νλ‘μ΄λ-μμ¬ μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ μ΅μ λΉμ©μ νμν©λλ€.
for( int k = 1; k<=n; k++){ // k : κ±°μ³κ°λ λμ
for( int i = 1; i<=n; i++){ // i : λμA
for( int j = 1; j<=n; j++){ // j : λμB
if( i != j){
city[i][j] = Math.min(city[i][j], city[i][k] + city[k][j]);
}
}
}
}
κ²½λ‘κ° μμ κ²½μ° ( μ : k = 1, i = 3, j = 4 )
city[3][4] 3(i)μμ 4(j)λ₯Ό λ°λ‘ κ°λ κ²½μ° vs city[i][k] + city[k][j] 3(i)μμ1(k)μ κ±°μ³ 4(j)λ‘ κ°λ κ²½μ°λ₯Ό λΉκ΅νμ¬ λ μ μ λΉμ©μ μΈν ν©λλ€. ( 1λ‘ μΈν )

κ²½λ‘κ° μμ κ²½μ° ( μ : k = 2, i = 4, j = 5 )
city[i][j] = 3 vs city[i][k] + city[k][j] = X + X
κ²½λ‘κ° μμκ²½μ° Xλ₯Ό λνκ² λ¨μΌλ‘ λ°λ‘ κ°λ κ²½λ‘κ° μλ€λ©΄ λΉμ°ν κ±°μ³κ°λ κ²½λ‘λ³΄λ€ μκΈ° λλ¬Έμ λ°λ‘ κ°λ κ²½λ‘κ° μΈν λμ΄μ§λλ€ ( 3μΌλ‘ μΈν )

μ΄μ²λΌ λ°λ‘ κ°λ κ²½λ‘μ, κ±°μ³κ°λ κ²½λ‘λ₯Ό λͺ¨λ λΉκ΅νλ©΄μ κ° μ μ κ³Όμ μ΅μ λΉμ©(λλ μ΅λ¨ 거리)λ₯Ό μ΄μ°¨μ λ°°μ΄λ‘ λνλΌ μ μκ²λ©λλ€.
π μ 체 μ½λ
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.lang.StringBuilder;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
int x = 100000 * (n-1) + 1;
int[][] city = new int[n + 1][n + 1];
for (int i = 1; i < city.length; i++) {
for( int j = 1; j<city[i].length; j++){
city[i][j] = x;
if( i == j){
city[i][j] = 0;
}
}
}
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());
city[a][b] = Math.min(city[a][b], cost);
}
for( int k = 1; k<=n; k++){
for( int i = 1; i<=n; i++){
for( int j = 1; j<=n; j++){
if( i != j){
city[i][j] = Math.min(city[i][j], city[i][k] + city[k][j]);
}
}
}
}
for( int i = 1; i<=n; i++){
for (int j = 1; j <= n; j++) {
if (city[i][j] == x) {
city[i][j] = 0;
}
sb.append(city[i][j]).append(" ");
}
sb.append("\n");
}
System.out.println(sb);
br.close();
}
}