본문 바로가기
온라인저지

[BOJ] 1766번: 문제집

by plzfday 2018. 7. 27.

https://www.acmicpc.net/problem/1766

위상 정렬 공부할 때 대표적으로 풀어보는 문제인 것으로 생각된다. 

indegree가 0인 것부터 출력해주는데 그 목록 중에 가능하면 쉬운 것부터 풀어야 하므로 우선 순위 큐를 이용해 해줘야 한다.

#include <cstdio>
#include <vector>
#include <queue>
#include <functional>
using namespace std;

void topo(int vertex, int edge)
{
    vector<vector<int>> ad;
    ad.resize(vertex);
    vector<int> indegrees(vertex, 0);
    while (edge--)
    {
        int a, b;
        scanf("%d %d", &a, &b);
        ad[a - 1].push_back(b - 1);
        indegrees[b - 1]++;
    }
    priority_queue<int, vector<int>, greater<int>> pq;
    for (int i = 0; i < vertex; ++i)
        if (indegrees[i] == 0)
            pq.push(i);

    while (!pq.empty())
    {
        int ext = pq.top();
        pq.pop();
        printf("%d ", ext + 1);
        for (int i = 0; i < ad[ext].size(); ++i)
        {
            int next = ad[ext][i];
            indegrees[next]--;
            if (indegrees[next] == 0)
                pq.push(next);
        }
    }
}

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    topo(n, m);
    return 0;
}

 

'온라인저지' 카테고리의 다른 글

[BOJ] 2178번: 미로 탐색  (0) 2018.08.02
[BOJ] 11383번: 뚊  (0) 2018.08.02
[BOJ] 4999번: 아!  (0) 2018.08.02
[BOJ] 2504번: 괄호의 값  (2) 2018.07.27
[BOJ] 5845번: Perimeter  (0) 2018.07.27
[BOJ] 10540번: KLOPKA  (0) 2018.07.27

댓글