방향 그래프에서 간선으로 주어진 정점 간 선후관계를 위배하지 않도록 나열하는 정렬
✔ 문제에서 원소 간의 선후 관계가 주어지고 순서를 정해야 하는 상황이면 위상 정렬을 떠올려 볼 수 있다.
indegree의 값을 저장했다가 매번 뻗어나가는 정점들의 indegree 값만 1 감소시켜도 과정을 수행 가능indegree가 0인 정점을 구하기 위해 매번 모든 정점들을 다 확인하는 대신 목록을 따로 저장하고 있다가 직전에 제거한 정점에서 연결된 정점들만 추가indegree 테이블을 채움indegree가 0인 정점들을 모두 큐에 넣음indegree 값을 1 감소시킴. 이 때 indegree가 0이 되었다면 그 정점을 큐에 추가vector<int> adj[10];
int deg[10];
int n;
queue<int> q;
vector<int> result;
for(int i = 1; i <= n; i++)
if(deg[i] == 0) q.push(i);
while(!q.empty()) {
int cur = q.front(); q.pop();
result.push_back(cur);
for(int nxt : adj[cur]) {
deg[nxt]--;
if(deg[nxt] == 0) q.push(nxt);
}
}
if(result.size() != n)
cout << "cycle exists";
else {
for(auto x : result) cout << x << ' ';
}
indegree를 감소시키는 연산은 각 간선에 대해 1번씩만 발생하기 때문에 시간복잡도는 이다.