Deff_Dev
[백준] 2252번 줄 세우기 (C++) 본문
문제
https://www.acmicpc.net/problem/2252
풀이
이 문제는 위상 정렬을 사용하여 풀이했다.
위상 정렬이란 ?
- 비순환 방향 그래프(DAG)에서 정점을 선형으로 정렬하는 것이다.
위상 정렬을 사용하기 위해서는 조건이 필요하다.
- 방향 그래프(Directed Graph)여야 한다.
- 비순환 그래프(Acyclic Graph)여야 한다. 즉, 사이클이 없어야 한다.
- 최소한 하나의 위상 정렬 결과가 존재해야 한다.
이 문제는 위 조건에 만족하기 때문에 위상 정렬을 사용하여 풀이했다.
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int n, m;
int degree[32001];
vector <int> vec[32001];
void Topological_Sort() {
queue<int> q;
for (int i = 1; i <= n; i++) {
if (degree[i] == 0) {
q.push(i);
}
}
while (!q.empty()) {
int front = q.front();
cout << front << " ";
q.pop();
for (int i = 0; i < vec[front].size(); i++) {
degree[vec[front][i]]--;
if (degree[vec[front][i]] == 0) {
q.push(vec[front][i]);
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int x, y;
cin >> x >> y;
degree[y]++;
vec[x].push_back(y);
}
Topological_Sort();
return 0;
}
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 2579번 계단 오르기 (C++) (0) | 2024.10.27 |
---|---|
[백준] 설탕 배달 (C++) (0) | 2024.10.27 |
[백준] 카드 1 (C++) (0) | 2024.10.14 |
[백준] 2607번 비슷한 단어 (C++) (0) | 2024.09.26 |
[백준] 2156번 포도주 시식 (C++) (0) | 2024.09.10 |