article thumbnail image
Published 2021. 7. 22. 11:58

문제 설명

풀이

위상 정렬을 이용하여 풀이할 수 있다. 위상 정렬을 이용하는 과정에서 더 쉬운 문제는 더 빨리 뽑기 위해 우선순위 큐를 이용하여 값이 작은 것을 우선으로 뽑아준다.

코드

#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

int cnt[32003];
vector<int> v[32003];
priority_queue<int, vector<int>, greater<int>> q; // 작은 것부터 뽑음

int main() {
    int N, M; scanf("%d %d", &N, &M);
    while (M--) {
        int a, b; scanf("%d %d", &a, &b);
        v[a].push_back(b);
        cnt[b]++;
    }
    for (int i = 1; i <= N; i++) {
        if (!cnt[i]) q.push(i);
    }
    while (!q.empty()) {
        int cur = q.top();
        q.pop();
        printf("%d ", cur);
        for (auto nxt : v[cur]) {
            if (--cnt[nxt] == 0) q.push(nxt);
        }
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

백준[17435] 합성함수와 쿼리  (0) 2021.07.23
백준[3584] 가장 가까운 최소 공통 조상  (0) 2021.07.23
백준[1005] ACM Craft  (0) 2021.07.21
백준[5670] 휴대폰 자판  (0) 2021.07.13
백준[14425] 문자열 집합  (0) 2021.07.13
복사했습니다!