알고리즘 문제 해결/BOJ

[위상 정렬] BOJ 2252 줄 세우기

jmkimmessi 2022. 6. 22. 04:19
반응형

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

 

문제 해결 알고리즘

 

전형적인 위상정렬 알고리즘 문제이다.

 

아래 링크에 자세한 풀이가 나와있다.

 

https://kimmessi.tistory.com/207

 

[알고리즘] 위상 정렬 (Topology Sort) - BFS

위상 정렬이란? 순서가 정해져있는 작업을 차례로 수행하여야할 때 그 순서를 결정해주기 위해 사용하는 알고리즘이다. 사이클이 없는 방향 그래프의 모든 노드를 방향성에 거스르지 않도록 순

kimmessi.tistory.com

 

소스 코드

 

#include <bits/stdc++.h>
using namespace std;

int N, M;

int indegree[32002];
vector<int> graph[32002];

void topologySort(){

    vector<int> result;
    queue<int> q;

    for(int i=1;i<=N;i++){
        if(indegree[i] == 0){
            result.push_back(i);
            q.push(i);
        }
    }

    while(!q.empty()){

        int now = q.front();
        q.pop();

        for(int i=0;i<graph[now].size();i++){

            indegree[graph[now][i]]--;

            if(indegree[graph[now][i]] == 0){

                result.push_back(graph[now][i]);
                q.push(graph[now][i]);
            }
        }
    }

    for(int i=0;i<result.size();i++) {
        cout << result[i] << ' ';
    }
}

int main(){
    ios::sync_with_stdio(0);
	cin.tie(0);
    cin >> N >> M;

    for(int i=0;i<M;i++){
        int A, B; cin >> A >> B;

        graph[A].push_back(B);

        indegree[B]++;
    }

    topologySort();
}
반응형