본문 바로가기
IT/BOJ

백준(BOJ) 2623 음악프로그램 ***

by 빨강자몽 2018. 6. 1.

# 위상정렬


Indegree를 이용한 위상정렬을 이용하여 구현하였다.



#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,c,node[32005];
vector<int> vert[32005],ans;
priority_queue<int,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);
		for (int k = 0; k < a-1; k++)
		{
			scanf("%d", &c);
			vert[b].push_back(c);
			// b->c를 향하는 간선을 저장한다.
			node[c]++;
			// c 노드에 향하는 간선의 개수를 저장한다.
			b = c;
		}
	}
	// 입력을 받아 온다.

	for (int i = 1; i <= n; i++)
		if (node[i] == 0)
			pq.push(i);
	// 해당 노드에 향하는 간선이 0인경우 시작지점 으로 간주하고 pq에 추가한다.
	
	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);
		}
		// 시작지점 다음 노드 중에 해당 노드를 향하는 간선이 없으면 pq에 추가해준다.

		ans.push_back(cur);
	}
	for(int i=1;i<=n;i++)
		if (node[i] != 0)
		{
			printf("0");
			return 0;
		}
	// 노드끼리 순환을하여 위상졍렬의 조건을 위반하면 0을 출력해주고 끝낸다.

	for (int i = 0; i < ans.size(); i++)
		printf("%d\n", ans[i]);
	return 0;
}


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

백준(BOJ) 1261 알고스팟 2 **  (0) 2018.06.01
백준(BOJ) 1766 문제집 **  (0) 2018.06.01
백준(BOJ) 1938 통나무 **  (0) 2018.05.31
백준(BOJ) 2468 안전 영역 **  (0) 2018.05.31
백준(BOJ) 1600 말이 되고픈 원숭이 ***  (0) 2018.05.31