알고리즘/코테
[백준 11404] 플로이드 (보충하기/)
kiwiiiv
2022. 7. 20. 21:06
https://www.acmicpc.net/problem/11404
11404번: 플로이드
첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가
www.acmicpc.net
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static int[][] minCosts;
static final int INF = 10000001; //최대 비용 100000*100
public static void main(String[] args) throws IOException {
//input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
StringTokenizer stk;
minCosts = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
minCosts[i][j] = INF;
if (i == j)
minCosts[i][j] = 0;
}
}
for (int i = 0; i < m; i++) {
stk = new StringTokenizer(br.readLine());
int start = Integer.parseInt(stk.nextToken());
int end = Integer.parseInt(stk.nextToken());
int cost = Integer.parseInt(stk.nextToken());
if (minCosts[start][end] == 0) {
minCosts[start][end] = cost;
} else {
minCosts[start][end] = Math.min(minCosts[start][end], cost);
}
}
//cal (i->k, k->j)
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
int passBy = minCosts[i][k];
if (passBy != 0) {
for (int j = 1; j <= n; j++) {
if (i == j)
continue;
minCosts[i][j] =
Math.min(minCosts[i][j], minCosts[k][j] + passBy);
}
}
}
}
//print
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (minCosts[i][j] == INF)
minCosts[i][j] = 0;
sb.append(minCosts[i][j] + " ");
}
sb.append("\n");
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
}