반응형
리뷰
위상 정렬에 우선 순위 큐를 사용하여 최대한 난이도가 낮은 순서로 출력하는 문제
https://www.acmicpc.net/problem/1766
문제 풀이
- 문제의 수 n과 선수 문제의 개수 m, 인접 리스트 벡터path를 전역변수로 설정해 준다.
- n과 m값을 입력 받고, m개의 선수 문제 정보를 인접 리스트 path에 추가해 준다.
- 선수 문제 개수를 저장할 cnt 벡터를 n + 1크기로, 내부 값을 모두 0으로 초기화 해준다.
- n개의 문제의 인접 리스트를 순회하며 인접 리스트에 담긴 문제의 개수를 증가시켜 준다.
- 오름차순 정렬 형태의 우선순위 큐 pq를 초기화 해준다.
- 다시 n개의 문제를 순회하며 cnt의 개수가 0개라면 pq에 추가해 준다.
- pq에 요소가 없을 때까지 순회하며 pq의 top요소를 뽑아 cn으로 저장하고 cn을 공백을 구분하여 출력해 준다.
- 이후 cn의 인접 리스트에 존재하는 문제의 cnt를 1개씩 내려주고 0이 되었다면 pq에 추가해 준다.
참고 사항
- N개의 문제는 모두 풀어야 한다.
- 먼저 푸는 것이 좋은 문제가 있는 문제는, 먼저 푸는 것이 좋은 문제를 반드시 먼저 풀어야 한다.
- 가능하면 쉬운 문제부터 풀어야 한다.
- 항상 문제를 모두 풀 수 있는 경우만 입력으로 주어진다.
3번 조건에 의해 우선 순위 큐를 사용해 주어야 한다.
정답 코드
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n, m;
vector<int> path[32001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
while (m--) {
int a, b; cin >> a >> b;
path[a].push_back(b);
}
vector<int> cnt(n + 1, 0);
for (int i = 1; i <= n; i++) for (int j : path[i]) cnt[j]++;
priority_queue<int, vector<int>, greater<int>> pq;
for (int i = 1; i <= n; i++) if (!cnt[i]) pq.push(i);
while (!pq.empty()) {
int cn = pq.top(); pq.pop();
cout << cn << " ";
for (int i : path[cn]) if (--cnt[i] == 0) pq.push(i);
}
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[G4] 백준 1806번 부분합 C++ 누적 합, 투 포인터 (0) | 2024.09.14 |
---|---|
[P4] 백준 3176번 도로 네트워크 C++ LCA, 트리, 최소 공통 조상 (0) | 2024.09.14 |
[G2] 백준 2352번 반도체 설계 C++ LIS, 가장 긴 증가하는 부분 수열 (1) | 2024.09.13 |
[G3] 백준 1516번 게임 개발 C++ 위상 정렬 (0) | 2024.09.12 |
[P5] 백준 1948번 임계경로 C++ 위상 정렬 (0) | 2024.09.11 |