simsimjae   6년 전

#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>

사이클이 생기는 경우 체크 

사이클이 생기는 경우 체크 안해줘서 틀린건 알고 있습니다.

근데 9%에서 런타임에러가 생기는데 어디서 생기는건지를 모르겠네요 도와주세요..

djm03178   6년 전

코드는 아래의 코드 올리는 칸에 올려주세요.

djm03178   6년 전

BFS는 큐에서 뺀 다음에 방문 체크를 하는 것이 아니라 큐에 넣을 때 체크해야 중복 방문이 일어나지 않습니다. visited[i]가 체크되지 않은 상태에서 indegree[i]가 0이기만 하면 무조건 넣어버리는데, 실제로 i가 큐에서 꺼내지기 전까지는 방문 체크를 하지 않고 있어 다른 점 방문 중 큐에 또 들어가고 또 들어갈 가능성이 있습니다.

댓글을 작성하려면 로그인해야 합니다.