백준 2252 c++

magicdrill·2024년 9월 26일

백준 문제풀이

목록 보기
448/673

백준 2252 c++

위상정렬 문제

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

using namespace std;

void input_data(int *N, int *M, vector<vector<int>>& height, vector<int>& in_degree)
{
	//cout << "input_data()\n";
	int i, A, B;

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

	//cout << "입력결과\n";
	//for (i = 1; i < height.size(); i++)
	//{
	//	cout << i << "번 뒤에 있는 사람 : ";
	//	for (auto temp : height[i])
	//	{
	//		cout << temp << " ";
	//	}
	//	cout << "\n";
	//}
	//cout << "\nin_degree\n";
	//for (int temp : in_degree)
	//{
	//	cout << temp << " ";
	//}
	//cout << "\n\n";

	return;
}

void find_answer(int N, int M, vector<vector<int>>& height, vector<int>& in_degree)
{
	int i, current, next, count = 1;
	queue <int> q;
	vector<int> answers(in_degree.size(), 0);

	for (i = 1; i < in_degree.size(); i++)
	{
		if (in_degree[i] == 0)
		{
			q.push(i);
		}
	}

	while (!q.empty())
	{
		current = q.front();
		q.pop();
		answers[count] = current;
		for (i = 0; i < height[current].size(); i++)
		{
			next = height[current][i];
			in_degree[next]--;
			if (in_degree[next] == 0)
			{
				q.push(next);
			}
		}
		count++;
	}

	for (i = 1; i < answers.size(); i++)
	{
		cout << answers[i] << " ";
	}
	cout << "\n";

	return;
}

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

	int N, M;
	vector<vector<int>> height;
	vector<int> in_degree;

	input_data(&N, &M, height, in_degree);
	find_answer(N, M, height, in_degree);

	return 0;
}

0개의 댓글