반응형
https://www.acmicpc.net/problem/11404
[문제풀이]
플로이드 워셜 알고리즘 문제였다.
플로이드 워셜 알고리즘이란 모든 정점에서 모든 정점까지의 최단 거리를 구하는 것으로,
초기 그래프를 행과 열이 같은 곳을 제외하고 매우 큰 값으로 저장하여 최솟값으로 갱신하며 최단 거리를 찾는 알고리즘이다.
출력 할 때 INF으로 남은 값을 0으로 초기화해주어야 했는데 그 부분을 놓쳤다. 좀 더 꼼꼼하게 풀자!
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/*
n개의 도시.
한 도시에서 출발하여 다른 도시에 도착하는 m개의 버스.
각 버스는 한 번 사용할 때 필요한 비용이 있음.
모든 도시의 쌍 (A,B)에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구하라.
*/
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static final int INF = 100_000_000;
static int n, m;
static int[][] costs;
public static void main(String[] args) throws IOException{
init();
floydWarshall();
/*
[출력]
a에서 b로 가는 최소 비용을 나타내는 그래프 출력.
갈 수 없으면 0을 출력
*/
for(int[] row : costs){
for(int column : row){
if(column == INF){
sb.append(0 + " ");
}else {
sb.append(column + " ");
}
}
sb.append("\n");
}
System.out.print(sb);
}
static void init() throws IOException {
/*
[입력]
1. 도시의 개수 n (2 <= n <= 100)
2. 버스의 개수 m (1 <= m <= 100,000)
3~m+2. 시작 도시 a, 도착 도시 b, 비용 c (a와 b가 같은 경우 없음. 비용은 100,000보다 이하의 자연수)
*/
n = Integer.parseInt(br.readLine());
m = Integer.parseInt(br.readLine());
costs = new int[n][n];
//그래프 초기화
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
//같으면 0
if(i == j){
costs[i][j] = 0;
}
//아니면 INF로 초기화
else{
costs[i][j] = INF;
}
}
}
for(int i = 0; i < m; i++){
st = new StringTokenizer(br.readLine());
int row = Integer.parseInt(st.nextToken()) - 1;
int column = Integer.parseInt(st.nextToken()) - 1;
int cost = Integer.parseInt(st.nextToken());
//더 작은 비용의 값을 저장해줌
costs[row][column] = Math.min(costs[row][column], cost);
}
}
static void floydWarshall(){
for(int k = 0; k < n; k++){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
//최단 경로 초기화
if(costs[i][j] > costs[i][k] + costs[k][j]){
costs[i][j] = costs[i][k] + costs[k][j];
}
}
}
}
}
}
반응형
'백준 > 그래프' 카테고리의 다른 글
[백준] 1753 : 최단경로 (JAVA) (2) | 2024.09.17 |
---|---|
[백준] 11779 : 최소비용 구하기 2 (1) | 2024.09.13 |