https://www.acmicpc.net/problem/1766
선행 조건( 보다 쉬운 문제) 이 딱 하나인 경우 트리 선회하면서 해결할 수 있다. 아래 코드로 해결 가능.
근데 이 문제는 선행 조건이 여러 개일 수 있다..!
#include <iostream>
#include <queue>
#include <set>
#include <algorithm>
using namespace std;
set<int> first;
int find_first[32001];
int v_up[32001];
priority_queue<int> q;
int N, M;
int find(int a) {
if (find_first[a] == 0) return a;
int k = find(find_first[a]);
find_first[a] = k;
return k;
}
int main(int argc, char argv[]) {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> N >> M;
for (int i = 0; i < M; i++) {
int a, b;
cin >> a >> b;
find_first[b] = a;
v_up[a] = b;
}
for (int i = 1; i <= N; i++) {
first.insert(find(i));
}
for (auto i : first) {
q.push(-i);
}
while (!q.empty()) {
int k = -q.top();
q.pop();
cout << k << ' ';
근데 선행 조건이 여러 개인 경우는?
내 선행 조건이 몇 개인지를 기억한다.
문제를 하나 풀때마다 그 문제를 선행 조건으로 가지는 문제들의 선행 조건 개수를 1씩 줄인다.
선행 조건 개수가 0이 됐으면 그 문제를 풀 수 있는 문제 큐에 넣는다.
이 큐는 우선순위 큐로 가장 쉬운 문제 (번호가 작은 문제) 부터 pop 한다.
'Algorithem > 백준 PS with code' 카테고리의 다른 글
백준 #1647 도시분할계획 : 크루스칼 알고리즘과 유니온파인드 (0) | 2023.01.09 |
---|---|
백준 #1922 네트워크 연결 : 최소신장트리(MST) (0) | 2023.01.09 |
백준 #1562 : 계단 수 (0) | 2023.01.06 |
백준 #1509 팰린드롬 분할 : 점화식 (0) | 2023.01.06 |
백준 #1007 - 벡터매칭 : 절반은 더하고, 절반은 빼면 된다? (0) | 2023.01.06 |