BFS, используя отладку имплантации смежного списка

0

Я пытаюсь отладить алгоритм bfs, используя смежный список. Он будет правильно печатать до определенной точки, а затем переходит в бесконечный цикл. Я сделал несколько распечаток и заметил, что он в конце концов перебирает первые два узла графика. Я не уверен, где в моем коде, который вызывает эту проблему. Это назначение, которое я получил, и это мое последнее средство. Если кто-то может указать мне в правильном направлении относительно того, что может быть проблемой, это поможет.

void bfsList(linkedList adjList[], int visit[], int j){
    Queue queue(24);
    if (visit[j] == 0){
        cout << j+1 << endl;
        visit[j] = 1;
        queue.enqueue(j);
        while(!queue.isEmpty()){
            int k = queue.dequeue();
            //queue.print();
            for(int i=0;i<adjList[k].len();i++){
                if (visit[adjList[k].elementAt(i)-1]==0){
                    cout << adjList[k].elementAt(i) << endl;
                    visit[adjList[k].elementAt(i)-1] = 1;
                }
                if (!queue.isFull()){
                    queue.enqueue(adjList[k].elementAt(i)-1);
                }
            }
        }
    }
}
  • 0
    Я также проверил список смежности. В этом списке нет ничего плохого, так как он тот же, что я использовал для реализации поиска в глубину. график загружается из CSV-файла.
Теги:
breadth-first-search
queue
graph-theory
adjacency-list

2 ответа

0
Лучший ответ

Enqueue только если узел не посещен.

if (visit[adjList[k].elementAt(i)-1]==0){
    cout << adjList[k].elementAt(i) << endl;
    visit[adjList[k].elementAt(i)-1] = 1;

    if (!queue.isFull()){
    queue.enqueue(adjList[k].elementAt(i)-1);
    }

}
  • 0
    Спасибо вам обоим, я сделал то, что вы сказали, но я обновил массив посещений после постановки в очередь
0
queue.enqueue(adjList[k].elementAt(i)-1);

зависит от того, был ли узел посещен. непроверенные:

if (!queue.isFull() && !visit[adjList[k].elementAt(i)-1]){
                queue.enqueue(adjList[k].elementAt(i)-1);
            }
  • 0
    Я пробовал это до публикации, и он только распечатывает первый узел, а затем второй узел. Насколько я понимаю, BFS это то, что он может посетить узел. это нужно будет поставить в очередь, чтобы получить их соседние узлы. поэтому, если я сделаю проверку там, он остановится после того, как напечатает соседний узел для первого узла.
  • 0
    Спасибо вам обоим, я сделал то, что вы сказали, но я обновил массив посещений после постановки в очередь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню