

처음에는 DFS로 풀이했는데 진입 순서가 정해진 경우 위상 정렬이 더 효과적이다.
위상 정렬 풀이에도 처음은 단순 큐를 사용했는데, 문제 조건에서 선행 풀이 문제가 없는 경우, 난이도가 쉬운 문제(번호가 낮은 순)으로 풀이해야 하므로 우선 순위큐로 수정했다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
void input_data(int* N, int* M, vector<vector<int>>& prior_question, vector<int> &input_degree);
void find_answer(int N, int M, vector<vector<int>>& prior_question, vector<int>& input_degree);
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
vector<vector<int>> prior_question;
vector<int> input_degree;
input_data(&N, &M, prior_question, input_degree);
find_answer(N, M, prior_question, input_degree);
return 0;
}
void input_data(int* N, int* M, vector<vector<int>>& prior_question, vector<int>& input_degree) {
int i, A, B;
cin >> *N >> *M;
prior_question.resize(*N + 1);
input_degree.resize(*N + 1, 0);
for (i = 0; i < *M; i++) {
cin >> A >> B;
prior_question[A].push_back(B);
input_degree[B]++;
}
return;
}
void find_answer(int N, int M, vector<vector<int>>& prior_question, vector<int>& input_degree) {
//queue<int> q;
priority_queue<int, vector<int>, greater<int>> q;
vector<int> answer;
int i, current;
cout << "최초 큐 : ";
for (i = 1; i <= N; i++) {
if (input_degree[i] == 0) {
cout << i << " ";
q.push(i);
}
}
cout << "\n";
while (!q.empty()) {
//current = q.front();
current = q.top();
q.pop();
answer.push_back(current);
cout << current << "에 대한 다음 큐 : ";
for (int next : prior_question[current]) {
input_degree[next]--;
if (input_degree[next] == 0) {
cout << next << " ";
q.push(next);
}
}
cout << "\n";
}
for (int num : answer) {
cout << num << " ";
}
cout << "\n";
return;
}