본문 바로가기
Problem Solving

[BOJ 2623] 음악프로그램

by Ladun 2020. 4. 20.

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

 

2623번: 음악프로그램

첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한 가수의 수가 나오고, 그 뒤로는 그 가수들의 순서가 나온다. N은 1이상 1,000이하의 정수이고, M은 1이상 100이하의 정수이다.

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[1001];
int ans[1001];

int main()
{
	int ansCnt = 0;
	vector<vector<int>> g;
	scanf("%d%d", &n, &m);
	g.resize(n + 1);
	for (int i = 0; i < m; i++)
	{
		int k, pre = -1;
		scanf("%d",&k);
		for (int j = 0; j < k; j++)
		{
			int a;
			scanf("%d", &a);
			if (pre != -1)
			{
				g[pre].push_back(a);
				indgree[a]++;
			}
			pre = a;
		}
	}

	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();
		ans[ansCnt++] = p;

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

	if (ansCnt == n)
	{
		for (int i = 0; i < ansCnt; i++)
		{
			printf("%d\n", ans[i]);
		}
	}
	else
		printf("0");
}

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

[BOJ 2143] 두 배열의 합  (0) 2020.04.20
[BOJ 1948] 임계경로  (0) 2020.04.20
[BOJ 2252] 줄 세우기  (0) 2020.04.20
[BOJ 1005] ACM Craft  (0) 2020.04.20
[BOJ 1516] 게임 개발  (0) 2020.04.20