알고리즘 문제/[백준]

[백준] 2252 줄 세우기

latter2005 2021. 1. 24. 02:59

문제 주소 : 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

fast io 미적용

문제 확인

 

위상 정렬 문제입니다.

위상 정렬이란 간단하게 말해서 사이클이 없는 방향 그래프에서 방향을 한쪽으로 몰아세우는 정렬 방법입니다.

자세한 설명은 다음 블로그에서 잘 해두었습니다.

 

 

Topological Sort(위상 정렬)

DAG에서 방향성을 거스르지 않게 정점들을 나열하는 알고리즘을 Topological sort(위상 정렬)이라 합니다. DAG란 Directed Acyclic Graph의 줄임말로 직역하자면 사이클이없는 방향(유향) 그래프 정도가 될

jason9319.tistory.com

 

풀이

 

알고리즘을 그대로 사용하면 간단하게 풀리는 문제입니다.

 

코드

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
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main() {
    cin.tie(NULL);
    ios::sync_with_stdio(false);
    queue<int> bfs;
    vector<int> graph[32001];
    int indegree[32001= { 0 };
    int n, m;
    cin >> n >> m;
 
    for (int i = 0; i < m; i++) {
        int a, b;
        cin >> a >> b;
        graph[a].push_back(b);
        indegree[b]++;
    }
    for (int i = 1; i <= n; i++)
        if (!indegree[i])
            bfs.push(i);
 
    while (!bfs.empty()) {
        int cur = bfs.front();
        bfs.pop();
        cout << cur << ' ';
        for (int next : graph[cur])
            if (!(--indegree[next]))
                bfs.push(next);
    }
 
}
cs
반응형

'알고리즘 문제 > [백준]' 카테고리의 다른 글

[백준] 1111 IQ Test  (4) 2021.01.26
[백준] 2534 카드 배열  (0) 2021.01.25
[백준] 6549 히스토그램에서 가장 큰 직사각형  (1) 2021.01.22
[백준] 16287 Parcel  (0) 2021.01.21
[백준] 1256 사전  (0) 2021.01.20