문제: 3665번: 최종 순위
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <iomanip> // setprecision을 사용하기 위한 헤더
#include <climits>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t-- > 0) {
int n;
cin >> n;
vector<int> indeg(n + 1, 0); // 0번 인덱스는 안 쓸 것
vector<vector<bool>> adjList(n + 1, vector<bool>(n+1, false)); // 연결 여부 저장
// 여기서 인덱스가 성적 가리킴
// 1등 정점 번호 가져오고 싶으면? preRank[1] 이런식으로..
vector<int> preRank(n + 1);
for (int i = 1; i < n + 1; i++) {
cin >> preRank[i];
}
// 1등 정점은 2,3,4,5 를 가리켜야함
// 2등 정점은 3,4,5 를 가리켜야함
// 이를 adjList 에 반영하기
for (int i = 1; i < n + 1; i++) {
for (int j = i + 1; j < n + 1; j++) {
adjList[preRank[i]][preRank[j]] = true; // i 등 정점이 j 등 정점을 가리킴
indeg[preRank[j]]++;
}
}
int m;
cin >> m;
while (m-- > 0) {
int a, b;
cin >> a >> b; // 정점 번호
// 만약 a 가 원래 b 보다 앞이었던 경우
if (adjList[a][b]) {
adjList[a][b] = false;
adjList[b][a] = true;
indeg[b]--;
indeg[a]++;
}
// 원래 b 가 a 보다 앞이었던 경우
else if (adjList[b][a]) {
adjList[b][a] = false;
adjList[a][b] = true;
indeg[a]--;
indeg[b]++;
}
}
// 위상 정렬 하기..
queue<int> noIndegNodes;
for (int i = 1; i < n + 1; i++) {
if (indeg[i] == 0) {
noIndegNodes.push(i); // 멘 처음 진입 차수가 없는 노드 번호 넣기..
}
}
vector<int> res;
bool flag = false;
while (!noIndegNodes.empty()) {
if (noIndegNodes.size() > 1) {
// 만약 queue 에 2개 이상의 값이 들어있다면 뭐가 먼전지 애매하니까 -1 출력
flag = true;
break;
}
int node = noIndegNodes.front();
noIndegNodes.pop();
res.push_back(node);
for (int i = 1; i < n + 1; i++) {
if (adjList[node][i]) {
indeg[i]--;
adjList[node][i] = false; // 중복 삽입 방지
if (indeg[i] == 0)
noIndegNodes.push(i);
}
}
}
// 모호한 경우
if (flag) {
cout << -1 << "\n";
}
else {
if (res.size() == n) {
for (int i = 0; i < n; i++)
cout << res[i] << " ";
cout << "\n";
}
else {
// 위상 정렬이 완료되면 res 에 모든 정점이 다 들어가야 하는데 개수가 부족하니까 IMPOSSIBLE
cout << "IMPOSSIBLE\n";
}
}
}
return 0;
}
아.. 진짜 너무 어려웠다. 기분이 너무 안 좋다. 이상한데에서 코드 한 줄 위치 잘 못 넣어서 1시간 넘게 찾았다. 아..
기분 나빠서 내일 다시 정리해야지.. 다시 풀어보고..
참고자료:
[PS]백준 3665 - 최종 순위.py (그.. : 네이버블로그
'백준 문제 > 위상정렬' 카테고리의 다른 글
[백준] 1766번 문제집 (0) | 2024.11.23 |
---|---|
[백준] 1005번 ACM Craft (0) | 2024.11.22 |
[백준] 2252번 줄 세우기 (0) | 2024.11.21 |