-
Java 11404 플로이드PS 2023. 8. 8. 10:24
https://www.acmicpc.net/problem/11404
11404번: 플로이드
첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가
www.acmicpc.net
거리를 구하는 알고리즘으로는 다익스트라, 플로이드 와샬이 있는데 해당 문제는 모든 원소에 대해서 최소비용을 구해야하기 때문에 플로이드 와샬 알고리즘으로 풀이하였습니다.
플로이드 와샬 알고리즘이란 a,b,c의 세개의 정점이 있다고 가정했을 때 b에서 c로 가는 비용과 b에서 a, a에서 c로 경유해서 가는 비용 중 최소값을 구할 수 있는 알고리즘으로 삼중 for문을 사용해 구현할 수 있습니다.
해당문제에서는 시작도시와 도착을 연결하는 노선은 하나가 아닐 수 있다라는 조건이 있기에 비용을 입력받을 때 주의한다면 알고리즘에 대해 알고있다면 쉽게 풀 수 있는 문제였던 거 같습니다.
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.*; public class Main { public static void main(String[] args) throws IOException { 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][n]; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(i == j){ map[i][j] = 0; }else { map[i][j] = 987654321; } } } for(int i = 0; i < m; i++){ StringTokenizer st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken())-1; int b = Integer.parseInt(st.nextToken())-1; int c = Integer.parseInt(st.nextToken()); map[a][b] = Math.min(map[a][b], c); } for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ for(int k = 0; k < n; k++){ map[j][k] = Math.min(map[j][k], map[j][i] + map[i][k]); } } } for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(map[i][j] == 987654321){ map[i][j] = 0; } sb.append(map[i][j]).append(" "); } sb.append("\n"); } System.out.println(sb); } }
'PS' 카테고리의 다른 글
Java 2636 치즈 (0) 2023.08.22 Java 1976 여행 가자 (0) 2023.08.11 Java 16235 나무 재테크 (0) 2023.07.28 Java 6593 상범빌딩 (0) 2023.07.25 Java 1926 그림 (0) 2023.07.25