빠켱이

백준 2252번 줄 세우기[C++] 본문

알고리즘/백준 알고리즘

백준 2252번 줄 세우기[C++]

빠켱이 2021. 1. 13. 00:36

2252번은 구현 방법에 따라 여러 답이 나올 수 있습니다.

제가 사용한 방법은 비교를 한 숫자들에 대해서 비교 여부를 체크하고 비교한 숫자 중 자기 자신보다 큰 숫자가 없으면 출력하는 방식으로 진행하였습니다.

위상 정렬에 대한 문제이므로 혹시 잘 이해가 안 가신다면 위상 정렬에 대한 개념을 한번 보고 다시 보시면 좋을 것 같습니다.

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

int n, m, tmp1, tmp2;
vector<int> graph[32001];
int check[32001] = {0};
queue<int> q;

void bfs(){
    for(int i = 1; i <= n; i++)
        if(check[i] == 0)
            q.push(i);
    while(!q.empty()){
        int a = q.front();
        q.pop();
        printf("%d ", a);
        for(int i = 0; i < graph[a].size(); i++){
            check[graph[a][i]]--;
            if(check[graph[a][i]] == 0)             //앞에 와야될 숫자가 없으면
                q.push(graph[a][i]);
        }
    }
}

int main(){
    scanf("%d %d", &n, &m);
    for(int i = 0; i < m; i++){
        scanf("%d %d", &tmp1, &tmp2);
        graph[tmp1].push_back(tmp2);
        check[tmp2]++;                              //앞에 와야할 숫자의 갯수
    }
    bfs();
}
Comments