반응형
https://www.acmicpc.net/problem/2252
2252번: 줄 세우기
첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의
www.acmicpc.net
위상정렬 (Topology Sort)
업무의 일정을 일어나야 할 순서에 따라 배치 (ex. 대학의 선수과목 구조, 스타크래프트 건물 짓는 순서)
수행과정 (출처: https://ko.wikipedia.org/wiki/위상정렬 )
- 자기 자신을 가리키는 변이 없는 꼭짓점을 찾음.
- 찾은 꼭짓점을 출력하고 출력한 꼭짓점과 그 꼭짓점에서 출발하는 변을 삭제
- 아직 그래프에 꼭짓점이 남아있으면 단계 1로 돌아가고, 아니면 알고리즘을 종료시킨다.
필요한 자료구조
1. 벡터: 그래프 저장 (인접 리스트)
2. 배열: 각 노드의 in-degree 저장
3. 큐: in-degree가 0인 노드 저장 (다음에 탐색할 것)
012345
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#include <iostream>
#include <vector>
#include <queue>
#define rep(i,n) for(int i=1;i<=n;i++)
using namespace std;
int n, m;
vector<vector<int> > v;
queue<int> q;
int in[32001];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
v.resize(n + 1);
rep(i, m) {
int a, b;
cin >> a >> b;
v[a].push_back(b);
in[b]++;
}
// in-degree가 0인 노드 삽입
rep(i, n) {
if (in[i] == 0) {
q.push(i);
cout << i << ' ';
}
}
// queue에 있는 노드와 연결된 간선 제거
while (!q.empty()) {
int now = q.front();
q.pop();
for (int i : v[now]) {
if (--in[i] == 0) {
cout << i << ' ';
q.push(i);
}
}
}
}
|
cs |
반응형