본문 바로가기

알고리즘문제풀이

[백준 2252]줄세우기

반응형

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

 

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<iostream>
#include<vector>
#include<queue>
using namespace std;
int N, M;
vector<int>a[32002];
int inDegree[32002];
void topologySort()
{
	int Result[32002] = { 0, };//결과담기
	queue<int>pq;
	//진입차수가 0인것 찾기
	for (int i = 1; i <= N; i++)
	{
		if (inDegree[i] == 0)
		{
			pq.push(i);
		}
	}
	//노드방문다하면 정렬완료
	for (int i = 1; i <= N; i++)
	{
		
		if (pq.empty()) ///비어있으면 사이클
		{
			cout << -1 << endl;
			return ;
		}
		int x = pq.front();
		Result[i] = x;//큐에서꺼내면서 순서 저ㄴ장
		pq.pop(); //노드삭제
		for (int j = 0; j < a[x].size();j++) //연결된간선삭제
		{
			int y = a[x][j];
			if (--inDegree[y] == 0)
			{
				pq.push(y);
			}
		}
	}
	for (int i = 1; i <= N; i++)
	{
		cout << Result[i] << " ";
	}
	cout << endl;
	return;
}
int main()
{
	cin >> N >> M;
	for (int i = 0; i < M; i++)
	{
		int x, y;
		cin >> x >> y;
		a[x].push_back(y); //A에서 B 연결
		inDegree[y]++;//진입차수증가
	}
	topologySort();
}
반응형

'알고리즘문제풀이' 카테고리의 다른 글

KMP알고리즘-문자열 찾기  (0) 2019.10.01
next_permutation STL 구현  (1) 2019.09.30
위상정렬  (0) 2019.04.08
[백준 16437]양 구출 작전  (0) 2019.03.02
[백준 1068]트리  (0) 2019.02.27