2016-04-15 5 views
-2

Ich versuche, eine BFS-Struktur mit C++ - Code zu erstellen. Ich bin ziemlich sicher, dass mein Code funktioniert, aber jedes Mal, wenn ich versuche, den booleschen Wert von 'explored' auf 'true' (in der letzten if-Anweisung des Codes) zu ändern, um einen Knoten als besucht zu markieren, wird er wieder in false geändert nächste Schleife der Funktion. Ich habe unten meine BFS-Funktion gepostet. Wenn mir jemand genau erklären könnte, warum der Wert sich immer wieder auf "false" ändert, wäre das sehr hilfreich, da ich nicht ganz sicher bin, was schief läuft.Bool-Wert geändert, aber es ändert sich während der nächsten Schleife der while-Anweisung

void BFS(int s,int n, vector<vector<int> > node_list) { 
    queue<int> Q; 


    bool *explored = new bool[n+1];// it Keeps track of explored vertices 

    for (int i = 1; i <= n; ++i)// Initialization of all vertices as unexplored 
    explored[i] = false; 
    Q.push(s);// Pushing of initial vertex to the queue 
    explored[s] = true; // marking it as explored 
    cout << "Breadth first Search starting from vertex "; 
    cout << s << " : " << endl; 

    while (!Q.empty()) { 
     int v = Q.front(); 
     Q.pop(); 
     cout << v << " "; 
     cout << explored[1]<<explored[2]<<explored[3]<<explored[4]<<endl; 
     vector<int> current_list = node_list[v-1]; 

     for (int i = 0;i<current_list.size();i++){ 
      for (int w = 1; w <= n; ++w){ 
       if ((w == current_list[i]) && (explored[w] != true)) { 
        cout << "in if: "<< w<<", "<<explored[w]<< endl; 
        Q.push(w); 
        explored[w] = true; 
       } 
      } 
     } 
    cout << endl; 
    delete [] explored; 
    } 
} 
+2

Sie haben 3 verschachtelte Schleifen. Können Sie darauf hinweisen, welche davon die "nächste Schleife" ist? Zeigen Sie idealerweise auch ein minimales vollständiges Beispiel mit einer Ausgabe, die das Problem tatsächlich veranschaulicht. Ich kann diese eine Funktion nicht kompilieren, um das Problem zu reproduzieren. – Useless

+0

Etwas außer Thema, aber Sie lesen nur von 'node_list', aber Sie nehmen es nach Wert (so kopiert es einen Vektor von Vektoren ... autsch). –

+1

Ein weiteres Problem ist im Allgemeinen, dass das Mischen der 1-basierten Array-Verarbeitung mit der 0-basierten Verarbeitung ein Rezept dafür ist, dass irgendwann einmal ein Fehler von 1 auftritt. In C++ beginnen Arrays/Puffer bei 0, nicht bei 1. Wenn ich einen Dollar für jedes Mal hätte, wenn jemand versucht, die 1-basierte Verarbeitung zu fälschen und dann einen Fehler nach dem anderen zu haben, wäre ich ein reicher Mann. – PaulMcKenzie

Antwort

3

mit der richtigen Formatierung:

void BFS(int s,int n, vector<vector<int> > node_list) { 
    queue<int> Q; 

    bool *explored = new bool[n+1]; // it Keeps track of explored vertices 

    for (int i = 1; i <= n; ++i) // Initialization of all vertices as unexplored 
     explored[i] = false; 

    Q.push(s); // Pushing of initial vertex to the queue 
    explored[s] = true; // marking it as explored 
    cout << "Breadth first Search starting from vertex "; 
    cout << s << " : " << endl; 

    while (!Q.empty()) { 
     int v = Q.front(); 
     Q.pop(); 
     cout << v << " "; 
     cout << explored[1]<<explored[2]<<explored[3]<<explored[4]<<endl; 
     vector<int> current_list = node_list[v-1]; 

     for (int i = 0;i<current_list.size();i++){ 
      for (int w = 1; w <= n; ++w){ 
       if ((w == current_list[i]) && (explored[w] != true)) { 
        cout << "in if: "<< w<<", "<<explored[w]<< endl; 
        Q.push(w); 
        explored[w] = true; 
       } 
      } 
     } 
     cout << endl; 
     delete [] explored; 
    } 
} 

es ist leicht zu sehen, dass Sie die dynamisch zugewiesenen explored jeder Iteration löschen.

Verwandte Themen