https://www.acmicpc.net/problem/11404
[모든] 정점과 정점 사이의 최단 거리를 알고 싶을 때 사용
(시간 복잡도 O(N^3)으로 그렇게 성능이 좋지 않다)
import java.io.*;
import java.util.*;
public class Main {
private static int n,m;
private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private static long weight[][];
private static final int INF = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException{
n = Integer.parseInt(br.readLine());
m = Integer.parseInt(br.readLine());
weight = new long[n+1][n+1];
for(int row = 1; row <= n;row++){
for(int column = 1; column <= n;column++){
if(row == column ) continue;
weight[row][column] = INF;
}
}
for(int x =0 ;x < m;x++){
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
weight[a][b] = Math.min(weight[a][b],w);
}
floyd();
for(int row = 1;row <= n;row++){
for(int column = 1;column <= n;column++) {
if(weight[row][column] == INF)
System.out.print(0 +" ");
else
System.out.print(weight[row][column] + " ");
}
System.out.println();
}
}
static void floyd(){
for(int x = 1; x <= n; x++){
for(int row = 1; row <= n; row++){
for(int column = 1;column <= n;column++){
if(weight[row][column] > weight[row][x] + weight[x][column])
weight[row][column] = weight[row][x] + weight[x][column];
}
}
}
} // floyd
}
'알고리즘(アルゴリズム) > 자주 까먹는 알고리즘(よく忘れるアルゴリズム)' 카테고리의 다른 글
벨만-포드 알고리즘(가중치가 음수일 때의 최단경로) (0) | 2023.06.23 |
---|---|
0-1 BFS (0) | 2023.06.20 |
다익스트라 알고리즘 (0) | 2023.06.15 |
이진수를 이용하여 O(log n)으로 거듭 제곱 빠르게 계산하기 (2) | 2023.01.30 |
조합론(Combination) == 이항 계수(binomial Coefficient) (0) | 2023.01.29 |