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 |
댓글