※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 7352번 문제인 Sorting it All Out이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/7352
각 수를 정점으로, 대소관계를 방향에지로 모델링하면, 주어진 그래프가 문제의 조건을 만족하는 시점은 그래프가 (1) DAG이고 (2) 최장거리가
DAG 여부를 알아내는 것은 주어진 그래프에 사이클이 있는지 판정하는 것으로 할 수 있다. 또한 DAG의 최장거리는 위상정렬순으로 정점을 탐색하는 것으로 구할 수 있다. 이 두 알고리즘을 잘 구현하여 문제를 해결하자. 주어질 수 있는 노드의 수가 매우 적으므로, 매 탐색단계마다 위 과정을 매번 수행하는 것으로도 문제를 충분히 해결할 수 있다.
한 테스트케이스의 과정 중간에서 DAG가 아니게 되었다는 정보를 알아냈어도 그 테스트케이스에서 주어지는 모든 대소관계를 읽을 필요가 있다는 점에 유의하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
int N, M;
vector<char> G[128];
pair<char, char> E[1000];
char par[128], lst;
int indeg[128], dist[128];
queue<int> que;
void func() {
lst = 0;
memset(par, 0, sizeof(par));
memset(indeg, 0, sizeof(indeg));
for (int i = 0; i < N; i++) {
char x = 'A' + i;
for (auto &y:G[x]) indeg[y]++;
}
memset(dist, 0, sizeof(dist));
for (int i = 0; i < N; i++) {
char x = 'A' + i;
if (!indeg[x]) dist[x] = 1, que.push(x);
}
while (!que.empty()) {
char cur = que.front(); que.pop();
lst = cur;
for (auto &nxt:G[cur]) {
indeg[nxt]--;
if (!indeg[nxt]) dist[nxt] = dist[cur] + 1, par[nxt] = cur, que.push(nxt);
}
}
}
void solve() {
for (int m = 0; m < M; m++) {
cin >> E[m].first >> E[m].second >> E[m].second;
}
for (char c = 'A'; c <= 'Z'; c++) G[c].clear();
for (int k = 0; k < M; k++) {
G[E[k].first].emplace_back(E[k].second);
func();
if (dist[lst] == N) {
cout << "Sorted sequence determined after " << k + 1 << " relations: ";
string ans = "";
while (lst) {
ans += lst;
lst = par[lst];
}
while (!ans.empty()) {
cout << ans.back();
ans.pop_back();
}
cout << ".\n";
return;
}
for (int i = 0; i < N; i++) {
char x = 'A' + i;
if (indeg[x]) {
cout << "Inconsistency found after " << k + 1 << " relations.\n";
return;
}
}
}
cout << "Sorted sequence cannot be determined.\n";
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
while (N) {
solve();
cin >> N >> M;
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 30570 // C++] Mini-Tetris 3023 (0) | 2025.03.11 |
---|---|
[BOJ 20490 // C++] Рыцарский щит (0) | 2025.03.10 |
[BOJ 8100 // C++] Containers (0) | 2025.03.06 |
[BOJ 8104 // C++] Fibonacci Words (0) | 2025.03.05 |
[BOJ 33556 // C++] Java String Equals (0) | 2025.03.04 |