728x90
11404번: 플로이드
첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가
www.acmicpc.net
- 368ms
플로이드 워셜
인접행렬
모든 노드에서 다른 모든 노드까지의 최단 비용을 찾는 문제로 노드의 범위(N≤100)가 작아 플로이드 워셜 알고리즘을 이용한다.
이 문제에서 주의해야 할 점은
- 입력값으로 중복된 출발도시와 도착도시가 들어올 수 있다는 점
- 갈 수 없는 곳은 0으로 출력해야 한다는 점
따라서 처음 입력을 받을 때, 출발노드에서 도착노드로 가는 비용이 더 작은 것을 이차원 테이블에 넣어줘야한다. 또한 모든 노드를 INF 로 초기화 후 구현하기 때문에 마지막 출력할 때, INF인 값은 0으로 바꾸어 출력해줘야 한다.
import java.io.*;
import java.util.*;
public class Main {
static final int INF = (int) 1e9;
static int n, m;
static int[][] graph;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
n = Integer.parseInt(br.readLine());
m = Integer.parseInt(br.readLine());
graph = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++)
Arrays.fill(graph[i], INF);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (i == j) graph[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 c = Integer.parseInt(st.nextToken());
graph[a][b] = Math.min(graph[a][b], c);
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (graph[i][j] == INF) sb.append(0);
else sb.append(graph[i][j]);
sb.append(' ');
}
sb.append('\n');
}
System.out.println(sb);
}
}
728x90
'Algorithm > Problem Solving' 카테고리의 다른 글
[BOJ/GoldIV] 17471. 게리맨더링 - JAVA 자바 (0) | 2024.03.03 |
---|---|
[BOJ\GoldIV] 1753. 최단 경로 - JAVA 자바 (0) | 2024.03.03 |
[SWEA/D4] 3234. 준환이의 양팔저울 - JAVA 자바 (0) | 2024.03.01 |
[SWEA/D5] 7258. 혁진이의 프로그램 검증 - JAVA 자바 (0) | 2024.03.01 |
[SWEA/D4] 1868. 파핑파핑 지뢰찾기 - JAVA 자바 (0) | 2024.03.01 |