본문 바로가기
Problem Solving

[BOJ 2252] 줄 세우기

by Ladun 2020. 4. 20.

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

 

2252번: 줄 세우기

첫째 줄에 N(1≤N≤32,000), M(1≤M≤100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의미이다. 학생들의 번호는 1번부터 N번이다.

www.acmicpc.net


위 문제는 전형적인 위상 정렬문제이다. 

 

위상 정렬 알고리즘대로 풀면 쉽게 풀 수 있는 문제이다.


#include <stdio.h>
#include <vector>
#include <queue>

#define max(a, b) ((a) > (b) ? (a) :(b))

using namespace std;

int n, m;
int indgree[100001];

int main()
{
	vector<vector<int>> g;
	scanf("%d%d", &n, &m);
	g.resize(n + 1);
	for (int i = 0; i < m; i++)
	{
		int a, b;
		scanf("%d%d", &a, &b);

		g[a].push_back(b);
		indgree[b]++;
	}

	queue<int> q;

	for (int i = 1; i <= n; i++)
	{
		if (indgree[i] == 0)
			q.push(i);
	}

	while (!q.empty())
	{
		int p = q.front(); q.pop();
		printf("%d ", p);

		for (auto s = g[p].begin(); s != g[p].end(); s++)
		{
			if (--indgree[*s] == 0)
				q.push(*s);
		}
	}
}

'Problem Solving' 카테고리의 다른 글

[BOJ 1948] 임계경로  (0) 2020.04.20
[BOJ 2623] 음악프로그램  (0) 2020.04.20
[BOJ 1005] ACM Craft  (0) 2020.04.20
[BOJ 1516] 게임 개발  (0) 2020.04.20
[BOJ 1806] 부분합  (0) 2020.04.17