BOJ 2252. 줄 세우기
1. 문제설명
- 일부 학생들의 키를 비교한 결과가 주어졌을 때 줄을 세우는 순서를 구하라
-
입력은 A, B로 주어지는 데 이는 A가 B 앞에 서야한다는 뜻이다.
- 문제 분류
- Graph, Topological Sorting
2. 알고리즘 설계
- 위상정렬(Topological Sorting) 기본 문제였다.
- 개념은 여기에 정리해 두었다.
- 주어지는
M
개의 입력 중 각각을 A, B라고 했을 때 그래프는 A->B의 형태가 될 것이다. - B가 가르켜진 횟수를 저장해둔다.
- 한번도 가르켜지지 않은 노드 번호가 있다면, 큐에 넣어준다.
- 참고로 반드시 한 개 이상 있다.
- 큐가 빌 때까지 반복
- 현재 큐의 가장 앞 원소를 꺼낸다.
- 이건 먼저 선택되어야 하는 노드이다.
- 출력한다 or result에 저장
- 가장 앞 원소가 가르키고 있는 원소의 가르킴 횟수를 하나씩 깎는다.
- 만약 깎았는데 횟수가 0이 되면 큐에 넣는다.
- 현재 큐의 가장 앞 원소를 꺼낸다.
3. 전체 코드
#include <bits/stdc++.h>
using namespace std;
const int SZ = 32'002;
int n, m, from, to, deg[SZ];
vector<int> res;
vector<int> adj[SZ];
queue<int> q;
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
while(m--) {
cin >> from >> to;
adj[from].push_back(to);
deg[to]++;
}
for(int i=1; i<=n; i++)
if(deg[i] == 0) q.push(i);
while(!q.empty()) {
int cur = q.front();
q.pop();
res.push_back(cur);
for(int nxt : adj[cur]) {
deg[nxt]--;
if(deg[nxt] == 0) q.push(nxt);
}
}
for(int a : res)
cout << a << ' ';
return 0;
}