https://www.acmicpc.net/problem/14567
순서가 정해져있는 문제인 위상정렬로 풀수있다 !
v[a].push_back(b);cnt=0인 값부터 queue에 넣어 벡터를 돌면서 v[x]에 있는 값들의 cnt를 1씩 줄여준다. cnt가 0이되는 값이 있으면 다시 벡터에 다시 넣고 똑같이 반복한다 ~!
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main(){
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int N,M; cin>>N>>M;
vector<vector<int>> v(N+1);
vector<int> cnt(N+1, 0);
vector<int> ans(N+1, 0);
// a b a가 b의 선수
int a,b;
for(int i=0; i<M; i++){
cin>>a>>b;
v[a].push_back(b);
cnt[b]++;
}
queue<pair<int, int>> q;
for(int i=1; i<=N; i++) if(cnt[i]==0) q.push({i,1});
while(!q.empty()){
int next = q.front().first;
int next_cnt = q.front().second;
ans[next] = next_cnt;
q.pop();
for(int i=0; i< (int) v[next].size(); i++){
int x = v[next][i];
cnt[x]--;
if(cnt[x]==0) q.push({x, next_cnt+1});
}
}
for(int i=1; i<=N; i++) cout<<ans[i]<<" ";
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int N,M; cin>>N>>M;
vector<pair<int, int>> v;
vector<int> dp(N+1, 1);
// a b a가 b의 선수
int a,b;
for(int i=0; i<M; i++){
cin>>a>>b;
v.push_back({b,a}); // b 듣기 위해 a 수강
}
sort(v.begin(), v.end());
for(int i=0; i<M; i++){
int pre = v[i].second;
int next = v[i].first;
dp[next] = max(dp[next], dp[pre]+1);
}
for(int i=1; i<=N; i++) cout<<dp[i]<<" ";
}