출처 : https://www.acmicpc.net/problem/2623
2623번: 음악프로그램
첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한
www.acmicpc.net
고려 사항
- 위상 정렬 알고리즘!
- 주어진 정보를 활용하여,
vector[가수 번호] = { 연결된 노드 리스트 ( 연결 당한 노드들 ) },
array[가수 번호] = 연결 당한 횟수. - 연결 당한 횟수가 0 인 가수 번호를 큐에 삽입.
- 큐가 비지 않으면 반복해서,
1. 정답 벡터에 제일 먼저 들어온 가수를 담고 pop 한다.
2. 그 가수가 연결한 가수 번호들의 cnt 를 -1 해주고,
3. 그 결과값이 0이면 큐에 삽입 - 큐가 비어서 반복문을 빠져 나왔을 때,
1. 정답 벡터에 가수 수인 n 만큼 담겼으면 출력.
2. 아니라면, 라인업 짜기 불가능, 0 출력!
#include <iostream>
#include <queue>
using namespace std;
queue<int> q;
int n, m, t, singer;
int cnt[1001];
bool visit[1001];
vector<int> s[1001];
vector<int> v, answer;
int main() {
cin>>n>>m;
for(int i=0;i<m;++i){
cin>>t;
for(int j=0;j<t;++j){
cin>>singer;
v.push_back(singer);
}
for(int j=1;j<t;++j){
s[v[j-1]].push_back(v[j]);
++cnt[v[j]];
}
v.clear();
}
for(int i=1;i<=n;++i){
if(cnt[i] == 0){
q.push(i);
}
}
while(!q.empty()){
int next = q.front();
answer.push_back(next);
q.pop();
for(int i : s[next]){
--cnt[i];
if(cnt[i] == 0){
q.push(i);
}
}
}
if(answer.size() == n){
for(int i : answer){
cout<<i<<"\n";
}
return 0;
}
cout<<"0";
return 0;
}
'BOJ 백준 > 그래프, 경로' 카테고리의 다른 글
백준 01647 - 도시 분할 계획 (0) | 2021.04.06 |
---|---|
백준 01504 - 특정한 최단 경로 (0) | 2020.10.24 |