알고리즘 문제 해결/BOJ

[위상 정렬] BOJ 14567 선수과목 (Prerequisite)

jmkimmessi 2022. 6. 18. 22:28
반응형

https://www.acmicpc.net/problem/14567

 

14567번: 선수과목 (Prerequisite)

3개의 과목이 있고, 2번 과목을 이수하기 위해서는 1번 과목을 이수해야 하고, 3번 과목을 이수하기 위해서는 2번 과목을 이수해야 한다.

www.acmicpc.net

 

문제 해결 알고리즘

 

전형적인 위상 정렬 문제이다.

 

아래의 링크에 위상 정렬 알고리즘에 대한 자세한 설명이 나와있다.

 

https://kimmessi.tistory.com/207

 

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

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

kimmessi.tistory.com

 

소스 코드

 

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

int v, e, cnt = 1;

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

void topologySort(){

    vector<int> result(1001);
    queue<int> q;


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

    cnt++;

    while(!q.empty()){

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


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

            if(indegree[graph[now][i]] == 0){
                q.push(graph[now][i]);
                result[graph[now][i]] = result[now]+1;
            }
        } 
    }

    for(int i=1;i<=v;i++) cout << result[i] << ' ';
}

int main(){
    
    cin >> v >> e;

    for(int i=0;i<e;i++){
        int a, b;
        cin >> a >> b;

        graph[a].push_back(b);

        indegree[b]+=1;
    }

    topologySort();
}
반응형