https://www.acmicpc.net/problem/2623
위상정렬 문제~
v[x]
: x가 나온 다음 출현할 수 있는 가수들edge[x]
: x가 출현하기 전 나오는 가수들의 개수 (들어오는 방향의 간선)#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
int N,M,x;
vector<int> v[1005];
int edge[1005];
vector<int> ans;
void topology(){
queue<int> q;
for(int i=1; i<=N; i++) {
if(edge[i]==0) {
ans.push_back(i);
q.push(i);
}
}
while(!q.empty()){
int tmp = q.front();
q.pop();
for(int i=0; i<(int) v[tmp].size(); i++){
int next = v[tmp][i];
if(--edge[next]==0) {
ans.push_back(next);
q.push(next);
}
}
}
return;
}
int main(){
cin>>N>>M;
for(int i=0; i<M; i++){
cin>>x;
vector<int> tmp(x);
for(int i=0; i<x; i++) cin>>tmp[i];
for(int i=0; i<x-1; i++) {
v[tmp[i]].push_back(tmp[i+1]);
edge[tmp[i+1]]++;
}
}
topology();
if(ans.size()==N) for(int i=0; i<N; i++) cout<<ans[i]<<'\n';
else cout<<"0";
}