#include<iostream>
#include <queue>
#include <vector>
using namespace std;
int result[1001];
queue<int> q;
bool w[1001][1001]; //i에서 j로 갈 수 있는가.
int indegree[1001]; //i번째 노드의 입차수.
bool visited[1001]; //i번째 노드 방문 여부.
int n, m;
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int temp; cin >> temp;
vector<int> v(temp);
for (int j = 0; j < temp; j++)
cin >> v[j];
for (auto j = v.begin(); j < v.end() - 1; j++)
{
int here = *j;
int next = *(j + 1);
w[here][next] = true;
indegree[next]++; //입차수 증가 시켜줌.
}
} //w와 indegree 완성
for (int i = 1; i <= n; i++) { //n은 노드의 수(가수의 수)
if (!indegree[i]) {
q.push(i);
visited[i] = true;
}
} //1,6 큐에 넣고 방문 했다고 표시
int k = 0;
while (q.size() != 0) {
int index = q.front(); q.pop(); //1
result[k++] = index; //2
for (int i = 1; i <= n; i++) {//3
if (w[index][i] && !visited[i])
{
w[index][i] = false; //연결끊어줌.
indegree[i]--; //연결된 노드의 입차수 하나 줄여줌.
}
}
visited[index] = true; //4. 현재 노드 방문 표시.
for (int i = 1; i <= n; i++)
if (!visited[i] && !indegree[i])
q.push(i); //5
}
if (!k) {
cout << 0 << endl;
}
else {
for (int i = 0; i < n; i++)
cout << result[i] << endl;
}
return 0;
}</int></int></vector></queue></iostream>
BFS는 큐에서 뺀 다음에 방문 체크를 하는 것이 아니라 큐에 넣을 때 체크해야 중복 방문이 일어나지 않습니다. visited[i]가 체크되지 않은 상태에서 indegree[i]가 0이기만 하면 무조건 넣어버리는데, 실제로 i가 큐에서 꺼내지기 전까지는 방문 체크를 하지 않고 있어 다른 점 방문 중 큐에 또 들어가고 또 들어갈 가능성이 있습니다.
simsimjae 5년 전
사이클이 생기는 경우 체크 안해줘서 틀린건 알고 있습니다.