풀이
위상 정렬을 이용하여 풀이할 수 있다.
코드
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
int cnt[32003];
int main() {
int N, M; scanf("%d %d", &N, &M);
vector<vector<int>> v(N + 1);
while (M--) {
int a, b; scanf("%d %d", &a, &b);
v[a].push_back(b);
cnt[b]++;
}
queue<int> q;
for (int i = 1; i <= N; i++) {
// 자기보다 작은 사람이 없다면 push
if (!cnt[i]) q.push(i);
}
for (int i = 0; i < N; i++) {
int cur = q.front();
printf("%d ", cur);
q.pop();
for (auto nxt : v[cur]) {
cnt[nxt]--;
// 자기보다 작은 사람이 없다면 push
if (!cnt[nxt]) q.push(nxt);
}
}
}
'Algorithm > BOJ' 카테고리의 다른 글
백준[10266] 시계 사진들 (0) | 2021.07.12 |
---|---|
백준[13506] 카멜레온 부분 문자열 (0) | 2021.07.11 |
백준[1305] 광고 (0) | 2021.07.10 |
백준[4354] 문자열 제곱 (0) | 2021.07.09 |
백준[3033] 가장 긴 문자열 (0) | 2021.07.08 |