in_degree[i] : 정점 i로 들어오는 가장자리 수
in_degree[i] = 0 인 정점 visit 표시 후 queue에 정점 추가
!queue.empty() 순회
dequeue()한 정점에 인접한 정점 중 방문하지 않은 정점의 in_degree 하나 감소
in_degree 감소 후 값이 0이면 해당 정점은 q.push()후 방문 표시
for (int i = 0; i < M; i++) {
int K; cin >> K;
int prev, cur;
cin >> prev;
for (int j = 1; j < K; j++) {
cin >> cur;
indegree[cur]++;
adj[prev].push_back(cur);
prev = cur;
}
}
queue<int> q;
// 들어오는 정점이 없는 노드 추가
for (int i = 1; i <= N; i++) {
if (indegree[i] == 0) q.push(i);
}
vector<int> ans;
while(!q.empty()) {
int cur = q.front();
q.pop();
// dequeue한 순서 = 위상 정렬 순서
ans.push_back(cur);
// 인접한 정점 하나씩 감소 -> 0이면 push
for (int nxt: adj[cur]) {
if (--indegree[nxt] == 0) q.push(nxt);
}
}
if (ans.size() != N) {
cout << 0 << '\n';
} else {
for (int i = 0; i < N; i++) {
cout << ans[i] << '\n';
}
}