while(1) 작심삼일();

[백준 1613번] 역사 본문

CS/baekjoon

[백준 1613번] 역사

hanjongho 2021. 4. 16. 23:33

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

 

1613번: 역사

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

www.acmicpc.net

풀이) 

생긴건 위상정렬이지만, 앞 뒤 순서를 확인할 수 없기에 O(N^3)인 플로이드 와샬로 해결해야 한다. 예를 들어 순서가 1 > 3, 3 > 5라면 1 > 5처럼 전체를 다 돌면서 채워주면 된다. 

#include <iostream>
using namespace std;

int n, m, s, a, b;
int accidents[401][401];

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    
    cin >> n >> m;
    while (m--)
    {
        cin >> a >> b;
        accidents[a][b] = 1;
    }
    
    for (int k = 1; k <= n; k++)
    {
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (i == j || i == k || j == k)
                    continue;
                if (accidents[i][k] && accidents[k][j])
                    accidents[i][j] = 1;
            }
        }
    }
    
    cin >> s;
    while (s--)
    {
        cin >> a >> b;
        if (accidents[a][b] == 1)
            cout << "-1\n";
        else if(accidents[a][b] == 0 && accidents[b][a] == 1)
            cout << "1\n";
        else if(accidents[a][b] == 0 && accidents[b][a] == 0)
            cout << "0\n";
    }

    return (0);
}

 

 

제 코드는 절대 완벽하지 않습니다

더 좋은 풀이방법 혹은 코드에 관한 질문이 있으시면 언제든 댓글주세요!

'CS > baekjoon' 카테고리의 다른 글

[백준 2470번] 두 용액  (0) 2021.04.19
[백준 7569번] 토마토  (0) 2021.04.17
[백준 1516번] 게임 개발  (0) 2021.04.14
[백준 1300번] K번째 수  (0) 2021.04.13
[백준 1238번] 파티  (0) 2021.04.13
Comments