[백준] 1613: 역사 - JAVA

https://www.acmicpc.net/problem/1613

풀이

사건들의 전후관계를 확인하는 문제이다.

이차원배열을 만들어 a사건 이후에 b사건이 이루어진다면 arr[a][b]를 true로 저장했다.

이때 플로이드-워셜 알고리즘을 사용했다.

for (int k = 1; k <= N; k++) {
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (table[i][k] && table[k][j]) {
                table[i][j] = true;
            }
        }
    }
}

배열을 다 채운 후 입력을 받으면서 table[a][b]가 true이면 -1, table[b][a]가 true이면 1, 둘 다 false이면 0을 출력했다.


메모리: 38252KB

시간: 472ms

언어: Java 11

코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        boolean[][] table = new boolean[N + 1][N + 1];
        for (int i = 0; i < K; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            table[a][b] = true;
        }

        for (int k = 1; k <= N; k++) {
            for (int i = 1; i <= N; i++) {
                if (!table[i][k]) {
                    continue;
                }
                for (int j = 1; j <= N; j++) {
                    if (table[k][j]) {
                        table[i][j] = true;
                    }
                }
            }
        }

        int S = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < S; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            boolean foward = table[a][b];
            boolean reverse = table[b][a];

            if (foward && !reverse) {
                sb.append("-1");
            } else if (!foward && reverse) {
                sb.append("1");
            } else {
                sb.append("0");
            }

            sb.append("\n");
        }

        System.out.println(sb);
    }

}