Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

전공공부

[BOJ_1507] 궁금한 민호 본문

Study/Problem Solving

[BOJ_1507] 궁금한 민호

monitor 2024. 2. 12. 10:19

설명


이 문제는 플로이드 워셜을 거꾸로 보면 됩니다. 즉, 이미 중간치를 거쳐서 초기화가 된 것인지 파악하면 되는 문제이므로 이를 거꾸로 돌려서 구현합니다. 그리고, 만일 이번에 돌렸는데 최소치가 갱신된다면 이는 모든 최소화된 도로가 연결된 것이 아니므로 조건에 따라서 -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