1 3, 2 3 ⇒ 이거는 1번이 3번보다 앞에, 2번이 3번보다 앞에 있어야 한다는 거다.
즉, 답은 1 2 3 또는 2 1 3.
Input (1 3, 2 3) 에서 뒤에 오는 번호(3 두 번)의 차수를 올려준다.
가장 앞에 있는 애들 (Input에서 두 번째 숫자로 안 들어온 애들). 최소 한 명은 있다.
얘들부터 큐에 다 넣어서, 하나씩 빼면서 얘들보다 뒤에 오는 애들 차수를 하나씩 낮춰주고, 만약 차수가 0이 되면 더이상 얘보다 꼭 앞에 와야 하는 애가 없는 거니깐 큐에 넣어준다.
큐에서 뺀 순서대로 적으면 그게 줄 세워진 결과다.
// 물론 이 문제는 사이클이 없는 경우를 주지만,
// 만약 사이클이 존재한다면,
// (예를 들어 1 3, 3 2, 2 1 , 이건 1이 3보다 크고 3이 2보다 큰데 2가 1보다 큰 말이 안 되는 상황.)
// 큐에서 전체 개수인 N번 만큼 빼기 전에 큐가 비어버린다.
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int MAX_N = 32000;
int N, M;
int Degree[MAX_N + 1];
int Result[MAX_N + 1];
vector<vector<int>> Graph;
void Input()
{
cin >> N >> M;
Graph.resize(N + 1);
for (int i = 0; i < M; ++i)
{
int A, B;
cin >> A >> B;
Graph[A].push_back(B);
Degree[B]++;
}
}
void Sort()
{
queue<int> Q;
for (int i = 1; i <= N; i++)
{
if (Degree[i] == 0) Q.push(i);
}
for (int i = 0; i < N; i++)
{
// When a cycle exists
if (Q.empty()) return;
int Now = Q.front();
Result[i] = Now;
Q.pop();
for (int j = 0; j < Graph[Now].size(); j++)
{
int Next = Graph[Now][j];
if (--Degree[Next] == 0) Q.push(Next);
}
}
}
int main() {
ios::sync_with_stdio(false), cin.tie(0);
Input();
Sort();
for (int i = 0; i < N; ++i)
{
cout << Result[i] << " ";
}
return 0;
}