본문 바로가기
ps

[백준]1766 - 문제집

by kariskan 2022. 7. 13.

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

 

1766번: 문제집

첫째 줄에 문제의 수 N(1 ≤ N ≤ 32,000)과 먼저 푸는 것이 좋은 문제에 대한 정보의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄부터 M개의 줄에 걸쳐 두 정수의 순서쌍 A,B가 빈칸을 사이에 두고 주

www.acmicpc.net

처음에 단순히 위상 정렬만 사용하면 되는데 왜 골드 2나 레이팅 돼 있는 건가 생각해서 조금 당황했지만,

가능하면 쉬운 문제부터 풀어야 한다.

이 문장 하나 때문인 것 같다.

 

위상 정렬의 결과로 순서를 매길 수 없는 문제들이라면, 우선순위 큐를 이용해서 무조건 작은 문제들이 먼저 풀리게끔 만들어 주면 된다.

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int n, m;
int inp[32001];
int main() {

	cin >> n >> m;
	vector<vector<int>> v(n + 1);

	for (int i = 0; i < m; i++) {
		int a, b;
		cin >> a >> b;
		inp[b]++;
		v[a].push_back(b);
	}
	priority_queue<int, vector<int>, greater<int>> q;
	for (int i = 1; i <= n; i++) {
		if (inp[i] == 0) {
			q.push(i);
		}
	}

	while (!q.empty()) {
		int a = q.top();
		q.pop();
		cout << a << ' ';

		for (int i = 0; i < v[a].size(); i++) {
			if (--inp[v[a][i]] == 0) {
				q.push(v[a][i]);
			}
		}
	}
}

'ps' 카테고리의 다른 글

[백준] 1854 - K번째 최단경로 찾기  (0) 2022.07.19
[백준] 13904 - 과제  (0) 2022.07.19
[백준] 11003 - 최솟값 찾기  (0) 2022.07.14
[백준] 4196 - 도미노  (0) 2022.07.14
[백준]1525 - 퍼즐  (0) 2022.07.13

댓글