article thumbnail image
Published 2021. 7. 10. 20:13

문제 설명

풀이

위상 정렬을 이용하여 풀이할 수 있다. 

코드

#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
복사했습니다!