-
백준(BOJ) 2252번 줄 세우기알고리즘 풀이/백준(Boj) 2019. 7. 25. 02:27
문제 : https://www.acmicpc.net/problem/2252
문제
N명의 학생들을 키 순서대로 줄을 세우려고 한다. 각 학생의 키를 직접 재서 정렬하면 간단하겠지만, 마땅한 방법이 없어서 두 학생의 키를 비교하는 방법을 사용하기로 하였다. 그나마도 모든 학생들을 다 비교해 본 것이 아니고, 일부 학생들의 키만을 비교해 보았다.
일부 학생들의 키를 비교한 결과가 주어졌을 때, 줄을 세우는 프로그램을 작성하시오.
나의풀이 :
DFS를 이용한 위상 정렬로 문제를 풀어 보았다.
1~N까지 dfs가 종료하는 순서를 기록한 뒤 이 순서를 뒤집는다. 그래프에 사이클이 없다면 이 순서는 그래프의 위상 정렬 결과가
될 것.
코드 ( C ++ )
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int N, M;
const int MAX = 32000 + 1;
vector<int> adj[MAX];
bool check[MAX];
vector<int> order;
vector<int> result;
void dfs(int i)
{
check[i] = true;
for (int next = 0; next < adj[i].size(); ++next)
{
if (check[adj[i][next]] == false && adj[i][next] != 0)
dfs(adj[i][next]);
}
order.push_back(i);
}
int main()
{
cin >> N >> M;
for (int i = 0; i < M; ++i)
{
int n1, n2;
cin >> n1 >> n2;
adj[n1].push_back(n2);
}
// adj에 주어진 그래프를 위상정렬한 결과를 반환한다.
memset(check, 0, sizeof(check));
order.clear();
for (int i = 1; i <= N; ++i)
if (!check[i])
dfs(i);
reverse(order.begin(), order.end());
for (int i = 0; i < order.size(); ++i)
cout << order[i] << " ";
return 0;
}
'알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 1436번 영화감독 숌 (0) 2019.07.29 백준(BOJ) 2750번 수 정렬하기 (0) 2019.07.26 백준(BOJ) 10816번 숫자 카드 2 (0) 2019.07.23 백준(BOJ) 2805번 나무 자르기 (0) 2019.07.22 백준(BOJ) 1931번 회의실배정 (0) 2019.07.19