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);
}
제 코드는 절대 완벽하지 않습니다
더 좋은 풀이방법 혹은 코드에 관한 질문이 있으시면 언제든 댓글주세요!