오늘의 알고리즘
[C++] 백준 2623 음악 프로그램
하늘하늘 .
2022. 12. 1. 02:07
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
int N = 0;
int M = 0;
int arr[1001] = {};
int child[1001] = {};
std::vector<int> parent[1001] = {};
int main()
{
std::cin >> N >> M;
for (int i = 0; i < M; ++i)
{
int num = 0;
std::cin >> num;
int prev = 0;
int next = 0;
for (int j = 0; j < num; ++j)
{
if (!prev)
{
std::cin >> prev;
}
else
{
std::cin >> next;
++child[next];
parent[prev].push_back(next);
prev = next;
}
}
}
std::queue<int> que = {};
for (int i = 1; i <= N; ++i)
{
if (!child[i])
{
que.push(i);
}
}
std::vector<int> ans = {};
while (!que.empty())
{
int now = que.front();
que.pop();
ans.push_back(now);
for (int i = 0; i < parent[now].size(); ++i)
{
int next = parent[now][i];
if (child[next])
{
--child[next];
if (!child[next])
{
que.push(next);
}
}
}
}
if (ans.size() == N)
{
for (int i = 0; i < ans.size(); ++i)
{
std::cout << ans[i] << "\n";
}
}
else
std::cout << 0;
return 0;
}
위상알고리즘 입니다.
부모를 하나 추가해주고, 본인의 부모를 알 수 있도록 넣어줍니다.
연결이 하나도 되지 않은 것들은 바로 큐에 넣어서 빠질 수 있도록 하고 순서대로 돌아가면서 계산합니다.
이전 것과 비교해서 안될 가능성이 있다는 것이 중요합니다.
전부 끝났을 때 모두 다 설정이 되었다면 출력, 없다면 0을 출력합니다.