728x90
반응형

2623번: 음악프로그램
문제
https://www.acmicpc.net/problem/2623
2623번: 음악프로그램
첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한
www.acmicpc.net
풀이
여러 가지 순서를 모두 만족하며 정렬해야 하므로 위상정렬 알고리즘을 사용한다. 기본적인 위상정렬 알고리즘을 배울 때 푸는 문제다. 각 순서를 입력받을 때마다 [앞->뒤]의 간선을 추가하고 뒤의 인덱스의 indegree 배열의 값을 1 증가시킨다.
indegree 배열의 값이 0인 정점을 모두 큐에 추가하고 차례대로 front 원소에 대해 탐색한다. front 원소를 ans 배열에 추가하고 front에서 향하는 정점들에 대해 indegree 값을 1 감소시키고 0이 되면 큐에 push 해 준다. 위 과정을 N번 반복하기 전에 큐가 비어있게 되면 사이클이 생겨 순서를 정할 수 없으므로 0을 출력하고 종료한다. 이외의 경우에는 마지막에 ans 배열의 값을 모두 출력한다.
코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int N, M;
vector<int> edge[1001], inDegree(1001, 0), ans;
cin >> N >> M;
while (M--) {
int K, u, v;
cin >> K;
if (K == 0)
continue;
cin >> u;
while (--K) {
cin >> v;
inDegree[v]++;
edge[u].push_back(v);
u = v;
}
}
queue<int> q;
for (int i = 1; i <= N; i++)
if (inDegree[i] == 0)
q.push(i);
for (int i = 1; i <= N; i++) {
if (q.empty()) {
cout << 0;
return 0;
}
int node = q.front();
q.pop();
ans.push_back(node);
for (int next : edge[node])
if (--inDegree[next] == 0)
q.push(next);
}
for (int e : ans)
cout << e << '\n';
return 0;
}
728x90
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 1516 게임 개발 (6) | 2023.04.05 |
---|---|
[백준 / BOJ] C++ 2252 줄 세우기 (4) | 2023.04.04 |
[백준 / BOJ] C++ 27930 당신은 운명을 믿나요? (4) | 2023.04.03 |
[백준 / BOJ] C++ 16566 카드 게임 (2) | 2023.04.03 |
[백준 / BOJ] C++ 20040 사이클 게임 (0) | 2023.04.03 |