문제 링크 : https://www.acmicpc.net/problem/1613

 

1613번: 역사

첫째 줄에 첫 줄에 사건의 개수 n(400 이하의 자연수)과 알고 있는 사건의 전후 관계의 개수 k(50,000 이하의 자연수)가 주어진다. 다음 k줄에는 전후 관계를 알고 있는 두 사건의 번호가 주어진다. 이는 앞에 있는 번호의 사건이 뒤에 있는 번호의 사건보다 먼저 일어났음을 의미한다. 물론 사건의 전후 관계가 모순인 경우는 없다. 다음에는 사건의 전후 관계를 알고 싶은 사건 쌍의 수 s(50,000 이하의 자연수)이 주어진다. 다음 s줄에는 각각 서

www.acmicpc.net

 

 문제 설명 

 

1. 각 사건을 번호로 표시하고 사건의 순서가 주어진다.

2. 순서를 입력후 전후 관계를 알고 싶은 사건이 입력되었을때 앞에 있는 번호의 사건이 먼저 일어났으면 -1,

  뒤에 있는 번호의 사건이 먼저 일어났으면 1, 어떤지 모르면 0을 출력.

 

 알고리즘 

 

1. 배열에 순서관계를 입력 받을 때  a , b순으로 입력받을경우 map[a][b]=-1 ,map[b][a]=1 로 초기화 한다.

2. 플루이드 알고리즘으로 순서관계를 정리한다.

3. 전후 관계를 알고싶은 곳의 배열 값을 출력한다.

 

 코드 

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<iostream>
#include<algorithm>
 
 
using namespace std;
 
int map[401][401];
int N, M;
 
int main() {
    cin.tie(NULL);
    ios::sync_with_stdio(false);
 
    cin >> N >> M;
 
    //배열 초기화
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            map[i][j] = 0;
        }
    }
 
    
    for (int i = 0; i <M; i++) {
            int a, b;
            cin >> a >> b;
            map[a-1][b-1= -1;
            map[b-1][a-1= 1;
    }
 
 
    //플루이드 알고리즘
    for(int k=0;k<N;k++){
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (i == j)continue;
 
            if (map[i][j] == 0) {
                if (map[i][k] == 1 && map[k][j] == 1)
                {
                    map[i][j] = 1;
                }
                else if (map[i][k] == -1 && map[k][j] == -1)
                {
                    map[i][j] = -1;
                }
            }
 
            
        }
    }
    }
 
    int k;
    cin >> k;
    for (int i = 0; i < k; i++) {
        int a, b;
        cin >> a >> b;
        cout << map[a - 1][b - 1]<<"\n";
    }
 
 
 
}
 
cs

'c++ > 백준' 카테고리의 다른 글

백준 11404 번 : 플로이드  (0) 2020.04.29
백준 3015번 : 오아시스 재결합  (0) 2020.04.29
백준 1722번 : 순열의 순서  (0) 2020.04.29
백준 9205번: 맥주마시면서 걸어가기  (0) 2020.04.29
백준 2293번 : 동전 1  (0) 2020.04.29
ariz1623