백준 1766 c++ : 위상정렬

magicdrill·2025년 4월 7일

백준 문제풀이

목록 보기
581/673

백준 1766 c++ : 위상정렬

처음에는 DFS로 풀이했는데 진입 순서가 정해진 경우 위상 정렬이 더 효과적이다.
위상 정렬 풀이에도 처음은 단순 큐를 사용했는데, 문제 조건에서 선행 풀이 문제가 없는 경우, 난이도가 쉬운 문제(번호가 낮은 순)으로 풀이해야 하므로 우선 순위큐로 수정했다.

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

void input_data(int* N, int* M, vector<vector<int>>& prior_question, vector<int> &input_degree);
void find_answer(int N, int M, vector<vector<int>>& prior_question, vector<int>& input_degree);

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, M;
	vector<vector<int>> prior_question;
	vector<int> input_degree;

	input_data(&N, &M, prior_question, input_degree);
	find_answer(N, M, prior_question, input_degree);

	return 0;
}

void input_data(int* N, int* M, vector<vector<int>>& prior_question, vector<int>& input_degree) {
	int i, A, B;

	cin >> *N >> *M;
	prior_question.resize(*N + 1);
	input_degree.resize(*N + 1, 0);
	for (i = 0; i < *M; i++) {
		cin >> A >> B;
		prior_question[A].push_back(B);
		input_degree[B]++;
	}

	return;
}

void find_answer(int N, int M, vector<vector<int>>& prior_question, vector<int>& input_degree) {
	//queue<int> q;
	priority_queue<int, vector<int>, greater<int>> q;
	vector<int> answer;
	int i, current;

	cout << "최초 큐 : ";
	for (i = 1; i <= N; i++) {
		if (input_degree[i] == 0) {
			cout << i << " ";
			q.push(i);
		}
	}
	cout << "\n";

	while (!q.empty()) {
		//current = q.front();
		current = q.top();
		q.pop();
		answer.push_back(current);

		cout << current << "에 대한 다음 큐 : ";
		for (int next : prior_question[current]) {
			input_degree[next]--;
			if (input_degree[next] == 0) {
				cout << next << " ";
				q.push(next);
			}
		}
		cout << "\n";
	}

	for (int num : answer) {
		cout << num << " ";
	}
	cout << "\n";

	return;
}

0개의 댓글