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

 

2623번: 음악프로그램

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

www.acmicpc.net

2623:: 음악프로그램

핵심::
위상정렬 기본 문제

 

풀이::

 

의견::

 

코드::

더보기
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

int main()
{
	int n, m;
	cin >> n >> m;
	vector<vector<int>> arr(n + 1);
	vector<int> en(n + 1, 0);
	for (int i = 1; i <= m; i++) {
		int k; cin >> k;
		int pv; cin >> pv;
		for (int j = 1; j < k; j++) {
			int t; cin >> t;
			arr[pv].push_back(t);
			en[t]++;
			pv = t;
		}
	}

	queue<int> q;
	vector<int> dap;

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

	while (!q.empty()) {
		auto cur = q.front(); q.pop();
		for (auto nv : arr[cur]) {
			if (--en[nv] == 0) {
				q.push(nv);
				dap.push_back(nv);
			}
		}
	}

	if (dap.size() < n) {
		cout << 0;
	}
	else {
		for (auto p : dap) {
			cout << p << "\n";
		}
	}

	return 0;
}