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 << " ";
}
}
'알고리즘' 카테고리의 다른 글
[LeetCode] 13. Roman to Integer (0) | 2021.07.10 |
---|---|
백준(BOJ) 1765번 피자 굽기 자바(java) (0) | 2020.06.07 |
백준(BOJ) 1033번 칵테일 (0) | 2020.05.08 |
백준(BOJ) 11585 속타는 저녁 메뉴 (0) | 2020.03.06 |
백준(boj) 1030번 프랙탈 평면 (0) | 2020.03.03 |