본문 바로가기

알고리즘/백준

백준 1613 역사

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

 

1613번: 역사

첫째 줄에 첫 줄에 사건의 개수 n(400 이하의 자연수)과 알고 있는 사건의 전후 관계의 개수 k(50,000 이하의 자연수)가 주어진다. 다음 k줄에는 전후 관계를 알고 있는 두 사건의 번호가 주어진다. ��

www.acmicpc.net

플로이드 워셜 알고리즘을 활용하는 문제다.

 

N이 400밖에 안되므로 O(N^3)을 해도 6400만이라서 시간초과에 걸리지 않는다.

 

 

/* 역사 */

#include <iostream>

#define MAX_N 400 + 1
#define MAX_EDGE 50000 + 1

using namespace std;

int n, k, s;
int order[MAX_N][MAX_N];

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	/* Input */
	cin >> n >> k;
	for (int i =1; i <= k; i++) {
		int a, b;
		cin >> a >> b;
		
		order[a][b] = -1;
		order[b][a] = 1;
	}

	/* 플로이드 워셜 */
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			for (int m = 1; m <= n; m++) {
				if (order[j][i] == -1 && order[i][m] == -1) {
					order[j][m] = -1;
				}
				else if (order[j][i] == 1 && order[i][m] == 1) {
					order[j][m] = 1;
				}
			}
		}
	}

	/* Application */
	cin >> s;
	for (int i = 0; i < s; i++) {
		int a, b;
		cin >> a >> b;
		cout << order[a][b] << '\n';
	}

	return 0;
}

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

백준 1981 배열에서 이동  (0) 2020.08.13
백준 2629 양팔 저울  (0) 2020.08.13
백준 5427 불  (0) 2020.08.10
백준 17144 미세먼지 안녕!  (0) 2020.08.10
백준 2213 트리의 독립집합  (0) 2020.08.09