728x90
반응형
https://www.acmicpc.net/problem/14567
14567번: 선수과목 (Prerequisite)
3개의 과목이 있고, 2번 과목을 이수하기 위해서는 1번 과목을 이수해야 하고, 3번 과목을 이수하기 위해서는 2번 과목을 이수해야 한다.
www.acmicpc.net
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int n, m, indegree[1001];
vector<int> a[1001];
void topologySort(){
int result[1001];
queue<int> q;
for(int i = 1; i <= n; i++){
if(indegree[i] == 0){
q.push(i);
}
result[i] = 1;
}
while(!q.empty()){
int cur = q.front();
q.pop();
for(int i = 0; i < a[cur].size(); i++){
int next = a[cur][i];
if(--indegree[next] == 0) {
q.push(next);
result[next] = max(result[next], result[cur] + 1); //★
}
}
}
for(int i = 1; i <= n; i++)
cout << result[i] << " ";
}
int main() {
cin >> n >> m;
for(int i = 0; i < m; i++){
int x, y;
cin >> x >> y;
a[x].push_back(y);
indegree[y]++;
}
topologySort();
return 0;
}
1학기부터 시작하므로 result 배열을 1로 초기화한다.
2, 3과목의 경우 1과목 이후 수강하여야 하므로 2학기에 수강할 수 있다.
5과목의 경우 4과목 이후 수강하는 조건이라면 2가 되지만 2과목 이후 수강이라는 조건도 있으므로 3학기에 수강할 수 있다.
선수 수강 과목의 학기 + 1 중에 큰 값을 고르는 것이 이 문제의 핵심!!
728x90
반응형
'Algorithm > BAEKJOON' 카테고리의 다른 글
[BOJ] 11055번 가장 큰 증가 부분 수열 (C++) (0) | 2022.05.16 |
---|---|
[BOJ] 11053번 가장 긴 증가하는 부분 수열 (C++) (0) | 2022.05.16 |
[BOJ] 1149번 RGB거리 (C++) (0) | 2022.05.14 |
[BOJ] 11660번 구간 합 구하기 5 (C++) (0) | 2022.05.14 |
[BOJ] 1918번 후위 표기식 (C++) (0) | 2022.05.07 |