위상정렬 알고리즘 공부 후 처음으로 풀어본 관련문제이다.
비순환 단방향 그래프라는 구조답게 과목들을 수강할때 선수과목이 있는 경우의 모습과 같다.
다만 이 문제에서 차이점은 단지 노드들의 순서를 출력하는 것이 아니라
인접노드 0인 노드들은 1로, 인접노드 0에서 이어진 노드들은 2로, 또 이 노드들에서 이어진 노드들은 3으로 결론내는점 정도가 차이점이다.
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false); cin.tie(NULL);
int N, M;
cin >> N >> M;
vector<vector<int>> graph(N + 1); // 노드를 1번부터 쓰므로 N + 1
vector<int> inDgree(N + 1, 0);
vector<int> answer(N + 1);
int u, v;
for (int i = 0; i < M; i++) {
cin >> u >> v;
graph[u].push_back(v);
inDgree[v]++;
}
queue<int> q;
for (int i = 1; i <= N; i++) {
if (inDgree[i] == 0) {
q.push(i);
answer[i] = 1; // 진입차수 시작부터 0인 노드들은 1학기에 듣는다.
}
}
for (int i = 0; i < N; i++) { // 1번부터 N번노드까지 N회반복
// 사이클 유무 판단 안해도 되는 문제
int node = q.front();
q.pop();
for (int adj : graph[node]) {
inDgree[adj]--;
if (inDgree[adj] == 0) {
q.push(adj);
answer[adj] = answer[node] + 1; // 이부분이 차이점
}
}
}
for (int i = 1; i <= N; i++) {
cout << answer[i] << ' ';
}
return 0;
}