하루 1공부
줄세우기 위상정렬 with 큐
n00bh4cker
2021. 1. 30. 05:13
내일은 재귀로 풀어야지!!!!
#include <iostream>
#include <vector>
#include <queue>
#define MAX 32001
using namespace std;
int n,m;
vector<int> vec[MAX];
int indegree[MAX];
queue<int> q;
int main(){
cin >> n >> m;
for (int i = 0 ; i < m ; i++){
int j,k;
cin >> j >> k;
indegree[k]++;
vec[j].push_back(k);
}
for (int i = 1; i <= n ; i++){
if (indegree[i] == 0)
q.push(i);
}
for (int i = 0 ; i < n ; i++){
int x = q.front();
q.pop();
cout << x << endl;
for (auto &c : vec[x]){
indegree[c]--;
if (!indegree[c]){
q.push(c);
}
}
}
}
위상정렬 큐를 이용해서 풀었음니다
일단 사이클이 없다는 전제하에 위상정렬의 출력은 총 n번 일어납니다
위상정렬이란건
재귀로도 가능하고 큐로도 가능한데요
사실 그래프 문제입니다
j가 k에 앞서야 하니까
j -> k 이런식이 되겠쬬????
k의 들어오는 녀석을 indegree라 하겠스빈다
걔를 넣어주고요
j담에 있어야할 친구들을 벡터에 넣어줍니다!!
인디그리가 빵이면 큐에 넣어주세요