반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
관리 메뉴

코딩하기 좋은날

백준 1613 역사 본문

백준(Baekjoon) 문제

백준 1613 역사

huiung 2020. 1. 29. 17:33
반응형

 

이 문제는 각역사간 관계가 주어졌을때 각 사건들의 관계를 파악하는 문제입니다.

 

각 사건들의 전후관계를 알기 위해서는 결국 이 두사건이 한사건에서 다른사건으로 도달 할 수 있느냐를 알면 됩니다.

 

따라서 주어진 사건의 관계들을 단방향 그래프로 생각하여 사건노드에서 다른사건노드로 가는 경로의 존재유무를 알면 문제를 해결 할 수 있습니다.

 

N이 400이하이므로 플로이드 와샬 알고리즘을 이용하면 모든 사건에 대한 경로를 파악할 수 있습니다.

 

이때 a,b가 순서대로 주어진다면 dp[a][b] 의 값이 존재하면 a가 더 빨리 발생한 사건이고 dp[b][a]값이 존재한다면 b가 더 빨리 발생한 사건이고 둘다 존재하지 않는다면 둘은 서로 관련이 없음을 알 수 있습니다.

 

다음은 코드입니다.

 

#include <iostream>
#include <vector>
#include <algorithm>

#define INF 987654321
using namespace std;

int dp[500][500];

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


	int n, k; cin >> n >> k;
	
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			dp[i][j] = INF;


	for (int i = 0; i < k; i++) {
		int a, b; cin >> a >> b;
		dp[a][b] = 1;
	}

	for(int k = 1; k <= n; k++)
		for(int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++) {
				dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
			}


	int s; cin >> s;

	for (int i = 0; i < s; i++) {
		int a, b; cin >> a >> b;		
		if (dp[a][b] == INF && dp[b][a] == INF) cout << 0 << '\n';
		else if (dp[a][b] == INF && dp[b][a] != INF) cout << 1 << '\n';
		else cout << -1 << '\n';

	}


	return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 11401 이항계수 3  (0) 2020.03.12
백준 1708 볼록 껍질  (0) 2020.02.13
백준 2225 합분해  (0) 2020.01.29
백준 1275 커피숍2  (0) 2020.01.22
백준 2243 사탕상자  (0) 2020.01.22