본문 바로가기

알고리즘

BOJ(백준) 2252 줄 세우기

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

parent 배열을 통해서 어떤 애가 트리의 꼭대기인지 파악한다.
즉, 두 번째 for문에서 parent[i] == false를 체크하는데 이 조건문을 통과하는 녀석은 제일 뒤에 있는 학생이다.
세 번째 for문은 어떤 트리에도 속하지 않으니까 위치 조건이 없는 학생을 출력한다.

print(int point) 함수는 매개변수로 들어온 point가 제일 뒤에 있는 학생이므로 이 학생의 앞에 오도록 지정된 학생을 방문하면서 출력한다. 몇 번 그려서 하면 바로 파악될듯

/* 줄 세우기 */

#include <iostream>
#include <vector>

#define MAX_STUDENT 32000 + 1
#define MAX_COMP 100000 + 1

using namespace std;

int N, M;
vector<int> priority[MAX_STUDENT];
bool is_used[MAX_STUDENT];
bool parent[MAX_STUDENT];

void print(int );

int main(void) {
    int lv, rv;

    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    cin >> N >> M;

    for (int i = 0; i < M; i++) {
        cin >> lv >> rv;
        parent[lv] = true;
        priority[rv].push_back(lv);
    }

    for (int i = 1; i <= N; i++) {
        if (parent[i] == false) {
            print(i);
        }
    }

    for (int i = 1; i <= N; i++) {
        if (is_used[i] == true) continue;
        cout << i << " ";
    }

    return 0;
}

void print(int point) {
    for (int i = 0; i < priority[point].size(); i++) {
        if (is_used[priority[point][i]] == true) continue;

        is_used[priority[point][i]] = true;
        int r = priority[point][i];

        print(priority[point][i]);
        cout << r << " ";
    }
}