알고리즘/알고리즘 문제풀이

[백준] 2252 : 줄 세우기, 위상 정렬

mint* 2023. 12. 20. 23:55
728x90

url : 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

 

위상정렬 문제이다.

 

위상정렬

사이클이 없는 방향 그래프 (= DAG)의 모든 노드를 순서대로 나열할 때 사용

=> 방향성 O, 순서 O, 사이클 X 

 

이 문제는 사람들의 키를 순서대로 정렬하여 줄을 세우기 때문에(순서O, 방향성 O, 사이클 X) 위상 정렬로 문제를 푼다.

위상 정렬 템플릿을 그대로 사용하면 풀리는 문제이다.

코드

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

int n, m, a, b; 
int indegree[32004];
vector<int> graph[100004];
vector<int> result;

void topologySort(){
    queue<int> q;
    // 진입차수가 0인 노드 큐에 집어넣기
    for(int i=1;i<=n;i++){
        if(indegree[i]==0) q.push(i);
    }
    // 큐가 빌때까지 반복
    while(!q.empty()){
        int now = q.front();
        q.pop();
        result.push_back(now);
        for(int i=0;i<graph[now].size();i++){
            int node = graph[now][i];
            indegree[node]-=1;
            if(indegree[node]==0) q.push(node);
        }
    }
}

int main(){
    //1. 입력받기
    cin >> n >> m;
    for(int i=0;i<m;i++){
        cin >> a >> b;
        graph[a].push_back(b);
        indegree[b]+=1;
    }
    // 2. 위상정렬 수행
    topologySort(); 
    //  3. 정답 출력
    for(int r:result) cout << r << " ";
}

 

풀이

728x90