-
백준 14567 선수과목 (Prerequisite) | C++[백준 알고리즘]/[C++] 2021. 3. 23. 10:20728x90반응형
이번 포스팅은 백준 14567번 선수과목 (Prerequisite)입니다.
아래 url를 클릭하시면 백준 사이트에서 문제를 볼 수 있습니다.
기본 알고리즘
위상 정렬 (Topological Sort)
풀이
위상 정렬하면서 출력 배열(과목 번호가 인덱스)에 수강 학기 수를 저장한다.
1학기 부터 시작하므로 result 배열을 1로 초기화 한다.
q 1 4 6
result[i] 1 1 1
cur = 1
q 1 4 6 2 3
result[i] 1 1 1
next = 2
result[2] < result[1]+1 이므로 result[2] = 2
q 1 4 6 2 3
result[i] 1 1 1 2
next = 3
result[3] < result[1]+1 이므로 result[3] = 2
q 1 4 6 2 3
result[i] 1 1 1 2 2
cur = 4
q 1 4 6 2 3 5
result[i] 1 1 1 2 2
next = 5
result[5] < result[4]+1 이므로 result[5] = 2
q 1 4 6 2 3 5
result[i] 1 1 1 2 2 2
cur = 6
q 1 4 6 2 3 5
result[i] 1 1 1 2 2 2
cur = 2
q 1 4 6 2 3 5
result[i] 1 1 1 2 2 2
next = 5
result[5] < result[2]+1 이므로 result[5] = 3
q 1 4 6 2 3 5
result[i] 1 1 1 2 2 3
cur = 3
q 1 4 6 2 3 5
result[i] 1 1 1 2 2 3
cur = 5
q 1 4 6 2 3 5
result[i] 1 1 1 2 2 3
전체 코드
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include <iostream>#include <vector>#include <queue>using namespace std;const int MAX = 1001;vector<int> adj[MAX];int inDeg[MAX];queue<int> q;int result[MAX];int main() {int N, M;cin >> N >> M;int a, b;for (int i = 0; i < M; i++) {cin >> a >> b;adj[a].push_back(b);inDeg[b]++;}for (int i = 1; i <= N; i++) {if (inDeg[i] == 0) {q.push(i);}result[i] = 1; //1학기부터 시작(초기화)}while (!q.empty()) {int cur = q.front();q.pop();for (int i = 0; i < adj[cur].size(); i++) {int next = adj[cur][i];inDeg[next]--;if (inDeg[next] == 0) {q.push(next);result[next] = max(result[next], result[cur] + 1); //★}}}for (int i = 1; i <=N; i++) {cout << result[i] << " ";}return 0;}cs 728x90반응형'[백준 알고리즘] > [C++]' 카테고리의 다른 글
백준 2437 저울 | C++ (0) 2021.03.25 백준 2230 수 고르기 | C++ (0) 2021.03.24 백준 2109 순회강연 | C++ (0) 2021.03.18 백준 1744 수 묶기 | C++ (0) 2021.03.17 백준 1377 버블 소트 | C++ (0) 2021.03.15