본문 바로가기
IT/BOJ

백준(BOJ) 1766 문제집 **

by 빨강자몽 2018. 6. 1.

위상정렬의 개념을 알고 문제에 접근하는 방법이 좋다고 생각됩니다~

간단하게 위상정렬을 설명하면 트리의 방향이 무조건 정해져있다고 생각하시면 됩니다.
(게임으로 설명을하면 빌드 또는 테크라 생각하시쉬면 쉽습니다.)

(A건물을 지어야만 B건물을 지을 수 있다! or A아이템의 상위템이 B아이템이다.)



만약, 문제의 조건중에 순환할 수 있다는 말이 있다면 위상정렬로 풀 수 없습니다.
(순환한다는 말은 A건물의 상위건물이 B이고, B건물의 상위건물이 A라면 말이 모순이 있겠죠?)


#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <math.h>
#include <queue>
#include <utility>
#include <functional>
#define MAX 40005
#define MOD 1000000007
#pragma warning(disable:4996)
using namespace std;

int n, m,a,b,node[32005];
vector<int> vert[32005];
priority_queue<nt,vector<int>,greater<int>> pq;

int main()
{
	fill_n(&node[0], 32005, 0);
	scanf("%d %d", &n, &m);

	for (int i = 0; i < m; i++)
	{
		scanf("%d %d", &a, &b);
		vert[a].push_back(b);
		node[b]++;
	}

	for (int i = 1; i <= n; i++)
		if (node[i] == 0)
			pq.push(i);
	
	while (!pq.empty())
	{
		int cur = pq.top();
		pq.pop();
		while (!vert[cur].empty())
		{
			int tmp = vert[cur].back();
			vert[cur].pop_back();
			node[tmp]--;
			if (node[tmp] == 0)
				pq.push(tmp);			
		}
		printf("%d ", cur);
	}
	return 0;
}


'IT > BOJ' 카테고리의 다른 글

백준(BOJ) 11779 최소비용 구하기 2 **  (0) 2018.06.01
백준(BOJ) 1261 알고스팟 2 **  (0) 2018.06.01
백준(BOJ) 2623 음악프로그램 ***  (0) 2018.06.01
백준(BOJ) 1938 통나무 **  (0) 2018.05.31
백준(BOJ) 2468 안전 영역 **  (0) 2018.05.31