위상정렬 문제
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
void input_data(int *N, int *M, vector<vector<int>>& height, vector<int>& in_degree)
{
//cout << "input_data()\n";
int i, A, B;
cin >> *N >> *M;
height.resize(*N + 1, vector<int>());
in_degree.resize(*N + 1, 0);
for (i = 0; i < *M; i++)
{
cin >> A >> B;
height[A].push_back(B);
in_degree[B]++;
}
//cout << "입력결과\n";
//for (i = 1; i < height.size(); i++)
//{
// cout << i << "번 뒤에 있는 사람 : ";
// for (auto temp : height[i])
// {
// cout << temp << " ";
// }
// cout << "\n";
//}
//cout << "\nin_degree\n";
//for (int temp : in_degree)
//{
// cout << temp << " ";
//}
//cout << "\n\n";
return;
}
void find_answer(int N, int M, vector<vector<int>>& height, vector<int>& in_degree)
{
int i, current, next, count = 1;
queue <int> q;
vector<int> answers(in_degree.size(), 0);
for (i = 1; i < in_degree.size(); i++)
{
if (in_degree[i] == 0)
{
q.push(i);
}
}
while (!q.empty())
{
current = q.front();
q.pop();
answers[count] = current;
for (i = 0; i < height[current].size(); i++)
{
next = height[current][i];
in_degree[next]--;
if (in_degree[next] == 0)
{
q.push(next);
}
}
count++;
}
for (i = 1; i < answers.size(); i++)
{
cout << answers[i] << " ";
}
cout << "\n";
return;
}
int main(void)
{
ios_base::sync_with_stdio(false);
cout.tie(NULL);
cin.tie(NULL);
int N, M;
vector<vector<int>> height;
vector<int> in_degree;
input_data(&N, &M, height, in_degree);
find_answer(N, M, height, in_degree);
return 0;
}