문제
https://www.acmicpc.net/problem/11404
11404번: 플로이드
첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가
www.acmicpc.net
설명
모든 도시의 쌍 (A, B)에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구해야 한다.
모든 도시 쌍들 사이의 최단 경로를 구하는 방법으로는 플로이드-워셜 알고리즘이 있다.
i번째 도시에서 j번째 도시까지의 최소 비용을 저장할 costs[i][j] 배열을 만든다.
자기 자신은 0으로 채우고 나머지는 Integer.MAX_VALUE로 채운다.
// 자기 자신은 0으로 채우고 나머지는 Integer.MAX_VALUE로 채운다.
int[][] costs = new int[N + 1][N + 1];
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (i == j)
costs[i][j] = 0;
else
costs[i][j] = Integer.MAX_VALUE;
}
}
for 문을 3번 돌려서 모든 도시 쌍들 사이의 최소 비용을 구해야 한다. (전체 쌍 최단 경로)
costs[i][j] > costs[i][k] + costs[k][j] 일 경우 costs[i][j]를 갱신하는 방법을 취한다.
// for 문을 3번 돌려서 모든 도시 쌍들 사이의 최소 비용을 구한다 (전체 쌍 최단 경로)
for (int k = 1; k <= N; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if ((i != j) && (costs[i][k] != Integer.MAX_VALUE) && (costs[k][j] != Integer.MAX_VALUE)) {
if (costs[i][j] > costs[i][k] + costs[k][j]) {
costs[i][j] = costs[i][k] + costs[k][j];
}
}
}
}
}
전체 코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int N, M;
static int[][] costs;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken());
// 자기 자신은 0으로 채우고 나머지는 Integer.MAX_VALUE로 채운다.
costs = new int[N + 1][N + 1];
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (i == j)
costs[i][j] = 0;
else
costs[i][j] = Integer.MAX_VALUE;
}
}
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());
if (costs[A][B] > C)
costs[A][B] = C;
}
// for 문을 3번 돌려서 모든 도시 쌍들 사이의 최소 비용을 구한다 (전체 쌍 최단 경로)
for (int k = 1; k <= N; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if ((i != j) && (costs[i][k] != Integer.MAX_VALUE) && (costs[k][j] != Integer.MAX_VALUE)) {
if (costs[i][j] > costs[i][k] + costs[k][j]) {
costs[i][j] = costs[i][k] + costs[k][j];
}
}
}
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (costs[i][j] == Integer.MAX_VALUE)
System.out.print(0 + " ");
else
System.out.print(costs[i][j] + " ");
}
System.out.println();
}
}
}
'알고리즘 > 그래프' 카테고리의 다른 글
[백준] 1854번 K번째 최단경로 찾기 (JAVA) (0) | 2023.04.30 |
---|---|
[백준] 11657번 타임머신 (JAVA) (0) | 2023.04.28 |
[백준] 1753번 최단경로 (JAVA) (0) | 2023.04.24 |
[CS] 최단 경로 (0) | 2023.04.24 |
[백준] 11400번 단절선 (JAVA) (0) | 2023.04.18 |
문제
https://www.acmicpc.net/problem/11404
11404번: 플로이드
첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가
www.acmicpc.net
설명
모든 도시의 쌍 (A, B)에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구해야 한다.
모든 도시 쌍들 사이의 최단 경로를 구하는 방법으로는 플로이드-워셜 알고리즘이 있다.
i번째 도시에서 j번째 도시까지의 최소 비용을 저장할 costs[i][j] 배열을 만든다.
자기 자신은 0으로 채우고 나머지는 Integer.MAX_VALUE로 채운다.
// 자기 자신은 0으로 채우고 나머지는 Integer.MAX_VALUE로 채운다. int[][] costs = new int[N + 1][N + 1]; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { if (i == j) costs[i][j] = 0; else costs[i][j] = Integer.MAX_VALUE; } }
for 문을 3번 돌려서 모든 도시 쌍들 사이의 최소 비용을 구해야 한다. (전체 쌍 최단 경로)
costs[i][j] > costs[i][k] + costs[k][j] 일 경우 costs[i][j]를 갱신하는 방법을 취한다.
// for 문을 3번 돌려서 모든 도시 쌍들 사이의 최소 비용을 구한다 (전체 쌍 최단 경로) for (int k = 1; k <= N; k++) { for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { if ((i != j) && (costs[i][k] != Integer.MAX_VALUE) && (costs[k][j] != Integer.MAX_VALUE)) { if (costs[i][j] > costs[i][k] + costs[k][j]) { costs[i][j] = costs[i][k] + costs[k][j]; } } } } }
전체 코드
import java.io.*; import java.util.StringTokenizer; public class Main { static int N, M; static int[][] costs; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); st = new StringTokenizer(br.readLine()); M = Integer.parseInt(st.nextToken()); // 자기 자신은 0으로 채우고 나머지는 Integer.MAX_VALUE로 채운다. costs = new int[N + 1][N + 1]; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { if (i == j) costs[i][j] = 0; else costs[i][j] = Integer.MAX_VALUE; } } 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()); if (costs[A][B] > C) costs[A][B] = C; } // for 문을 3번 돌려서 모든 도시 쌍들 사이의 최소 비용을 구한다 (전체 쌍 최단 경로) for (int k = 1; k <= N; k++) { for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { if ((i != j) && (costs[i][k] != Integer.MAX_VALUE) && (costs[k][j] != Integer.MAX_VALUE)) { if (costs[i][j] > costs[i][k] + costs[k][j]) { costs[i][j] = costs[i][k] + costs[k][j]; } } } } } for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { if (costs[i][j] == Integer.MAX_VALUE) System.out.print(0 + " "); else System.out.print(costs[i][j] + " "); } System.out.println(); } } }
'알고리즘 > 그래프' 카테고리의 다른 글
[백준] 1854번 K번째 최단경로 찾기 (JAVA) (0) | 2023.04.30 |
---|---|
[백준] 11657번 타임머신 (JAVA) (0) | 2023.04.28 |
[백준] 1753번 최단경로 (JAVA) (0) | 2023.04.24 |
[CS] 최단 경로 (0) | 2023.04.24 |
[백준] 11400번 단절선 (JAVA) (0) | 2023.04.18 |