BOJ : https://www.acmicpc.net/problem/2252
github : https://github.com/junho0956/Algorithm/blob/master/2252/2252/%EC%86%8C%EC%8A%A4.cpp
위상정렬 형태의 코드입니다.
v[a] 내부의 값들은 a 뒤에 와야하는 값들을 의미하는 것이고
in[b] 의 값들은 b 앞에 와야하는 값들의 갯수 입니다.
이 값들을 비교대로 나열했다고 생각해보면 반드시 가장 앞에 서야하는 값이 존재하게 됩니다.
그게 in[b] == 0 의 기준이 됩니다.
이 값들을 queue 에 넣어놓고, 현재 queue 내부의 값들에는 순서(서열)가 상관없으니
순서대로 뽑아서 자신의 뒤에 와야할 숫자들을 탐색합니다.
in[자신의 뒤에 올 숫자]를 비교할때마다 1씩 감소시키다가
in[자신의 뒤에 올 숫자]가 0이 된다면 더이상 그 숫자와는 비교될 숫자가 없는 것이니 queue에 삽입합니다.
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
|
#include <queue>
#include <cstdio>
#include <vector>
using namespace std;
vector<int> v[32001];
int in[32001];
queue<int> q;
int main() {
int N, M, a, b;
scanf("%d%d", &N, &M);
for (int i = 0; i < M; i++) {
scanf("%d%d", &a, &b);
v[a].push_back(b);
in[b]++;
}
for (int i = 1; i <= N; i++) {
if (in[i] == 0) {
q.push(i);
}
}
while (!q.empty()) {
int parent = q.front();
q.pop();
printf("%d ", parent);
for (int i = 0; i < v[parent].size(); i++) {
int child = v[parent][i];
in[child]--;
if (!in[child]) q.push(child);
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
'algorithm > BOJ' 카테고리의 다른 글
백준 1011번 : Fly me to the Alpha Centauri - Junnnho (0) | 2019.05.19 |
---|---|
백준 2529번 : 부등호 Junnnho (0) | 2019.05.17 |
백준 2623번 - 음악프로그램 Junnnho (0) | 2019.05.15 |
백준 : 1516번 - 게임 개발 Junnnho (0) | 2019.05.14 |
2568번 : 전깃줄2 - Junnnho (0) | 2019.04.08 |