전공공부
[BOJ_1507] 궁금한 민호 본문
설명
이 문제는 플로이드 워셜을 거꾸로 보면 됩니다. 즉, 이미 중간치를 거쳐서 초기화가 된 것인지 파악하면 되는 문제이므로 이를 거꾸로 돌려서 구현합니다. 그리고, 만일 이번에 돌렸는데 최소치가 갱신된다면 이는 모든 최소화된 도로가 연결된 것이 아니므로 조건에 따라서 -1을 출력합니다.
코드
package BOJ.shortest_path;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class BOJ_1507 {
public static void main(String[] args) throws Exception{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tk = new StringTokenizer(in.readLine()," ");
int N = Integer.parseInt(tk.nextToken());
int map[][] = new int[N][N];
boolean check[][] = new boolean[N][N];
for (boolean tmp[] : check){
Arrays.fill(tmp, true);
}
for (int i = 0; i < N; i++) {
tk = new StringTokenizer(in.readLine()," ");
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(tk.nextToken());
}
}
for (int k = 0; k < N; k ++) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(i == j || j == k || k == i){
continue;
}
if(map[i][j] > map[i][k] + map[k][j]){
System.out.println(-1);
return;
}
if (map[i][j] == map[i][k] + map[k][j])
check[i][j] = false;
}
}
}
int ans = 0;
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
if(check[i][j]){
ans += map[i][j];
}
}
}
System.out.println(ans);
}
}
1507번: 궁금한 민호
강호는 N개의 도시로 이루어진 나라에 살고 있다. 각 도시는 M개의 도로로 연결되어 있으며, 각 도로를 지날 때 필요한 시간이 존재한다. 도로는 잘 연결되어 있기 때문에, 도시 A에서 B로 이동할
www.acmicpc.net
'Study > Problem Solving' 카테고리의 다른 글
[BOJ_1010] 다리놓기 (0) | 2024.02.14 |
---|---|
[BOJ_2748] 피보나치 수열2 (1) | 2024.02.13 |
[BOJ_1865] 웜홀 (1) | 2024.02.11 |
[BOJ_22865] 가장 먼 곳 (1) | 2024.02.11 |
[BOJ_11657] 타임머신 (1) | 2024.02.07 |