백준 1613 - 역사
알고리즘/백준

백준 1613 - 역사

[문제 바로가기]

 

1. 유형

프롤이드 와샬

 

2. 문제 분석

2-1. 해설

플로이드 와샬을 쓰는 문제였습니다.

N=400이기 때문에, 3중 for문을 돌려도 시간안에 들어옵니다.

플로이드를 사용해서 출발점에서 도착지점 까지의 최단거리를 구해서 저장합니다.

 

맵 초기화

알고리즘 적용 후

S개의 인풋값이 (1,5) (2,4) (3,1)이 주어집니다.

(1,5)는 무한대 이니깐 0출력

(2,4)는 1이니깐 관계를 알 수 있음, -1 출력

(3,1)는 무한대이지만 (1,3)은 관계를 알 수 있음. 1 출력

 

2-2. 설계

2차원 배열을 INF로 초기화 ->  플로이드 와샬 -> 인풋 쌍을 보면서 출력

 

 

3. 코드

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

//https://www.acmicpc.net/problem/1613
//백준 1613번 역사

public class boj_1613_역사 {
	static int INF = 160000;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = stoi(st.nextToken());
		int K = stoi(st.nextToken());
		int m[][] = new int[N][N];
		for (int i = 0; i < N; i++) {
			Arrays.fill(m[i], INF);
		}
		for (int i = 0; i < K; i++) {
			st = new StringTokenizer(br.readLine());
			int a = stoi(st.nextToken()) - 1;
			int b = stoi(st.nextToken()) - 1;
			m[a][b] = 1;
		}
		for (int mid = 0; mid < N; mid++) {
			for (int from = 0; from < N; from++) {
				for (int to = 0; to < N; to++) {
					if (from == to)
						continue;
					if (m[from][mid] + m[mid][to] < m[from][to]) {
						m[from][to] = m[from][mid] + m[mid][to];
					}
				}
			}
		}
		st = new StringTokenizer(br.readLine());
		int S=stoi(st.nextToken());
		while (S-- > 0) {
			st = new StringTokenizer(br.readLine());
			int a = stoi(st.nextToken()) - 1;
			int b = stoi(st.nextToken()) - 1;
			if(m[a][b]!=m[b][a]) {
				if(m[a][b]!=INF) {
					System.out.println(-1);
				}else
					System.out.println(1);
			}else {
				System.out.println(0);
			}
		}
	}

	static int stoi(String s) {
		return Integer.valueOf(s);
	}
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 17265 - 나의 인생에는 수학과  (0) 2021.09.25
백준 1967 - 트리의지름  (0) 2021.09.24
백준 17255 - N으로 만들기  (0) 2021.09.23
백준 9548 - 무제  (0) 2021.09.22
백준 17141 - 연구소2  (0) 2021.09.21