Naruszenie dostępu do odczytu - implementacja algorytmu DFS

0

Witam, mianowicie mam problem z moją implementacją algorytmu DFS, program zawiesza się przy próbie odczytania wielkości listy sąsiedztwa i wyskakuje mi następujący błąd w programie Visual Studio:
Zgłoszono wyjątek: naruszenie dostępu do odczytu.
std::_Vector_alloc<std::_Vec_base_types<int,std::allocator<int> > >::_Mylast(...) zwrócił 0x8.
Myślę że mój błąd wynika z tego jak zadeklarowałem swoją listę sąsiedztwa, niestety przy moim aktualnym poziomie nie jestem w stanie stwierdzić gdzie dokładnie leży błąd i jak go naprawić.

#include <iostream>
#include <vector>
#include <stack>

    using namespace std;

    int N, M;
    vector<int> *ls;
    bool *visited = new bool[N];

    void DFS(int v){
    visited[v]=true;
    cout<<v<<endl;
    int i;
        for(i=0;i<ls[v].size();i++){
            int u=ls[v][i];
            if(visited[u]==false){
                DFS(u);
            }
        }
    }


    int main(){
    cout<<"Podaj kolejno ilosc wierzcholkow twojego grafu oraz ilosc krawedzi: "<<endl;
    cin>>N;
    cin>>M;

    vector<int> *ls = new vector<int>[N];

    cout<<"Podaj krawedzie w formacie w1 w2 np. 1 5 "<<endl;

    for(int i=0; i<M; i++){ // Lista sasiedztwa - ls
        int w1, w2;
        cin>>w1;
        cin>>w2;
        ls[w1].push_back(w2);
        }

    cout<<"Listy sasiedztwa :"<<endl;

    for(int i=0; i<N; i++){
            cout<<"Sasiadem "<<i<<" jest: ";
        if(ls[i].size()==0) cout<<"nikt";
        for(int j=0; j<ls[i].size(); j++){
            cout<<ls[i][j]<<" ";
        }
            cout<<endl;
    }

    for(int i=0;i<N; i++){
        visited[i]=0;
    }

    DFS(0);

    delete [] ls;
    return 0;
    }

Do testowania swojego programu wklejałem następujące dane:

6 8
0 1
1 0
1 1
0 3
3 1
4 0
5 4
3 4

2
vector<int> *ls;

Po co wskaźnik, i to globalny?

int N, M;
bool *visited = new bool[N];

Alokujesz 0 elementów. Poza tym, użyj wektora zamiast new/delete (tylko wyjątkowo std::vector<uint8_t> zamiast std::vector<bool>).

Wywala się pewnie na tym, że ls globalne jest w main() przesłonięte przez zmienną o identycznej nazwie i typie.

Nie używaj zmiennych globalnych, nie używaj new/delete jak nie musisz (a nie musisz, więcej tutaj).

Zacznij formatować jakoś kod, bardzo ciężko się to czyta.

0

Przestawiłem swoje zmienne do funkcji main, oraz przekazałem funkcji listę sąsiedztwa oraz tablicę z odwiedzonymi wierzchołkami, program działa, problem rozwiązany. Co do new/delete oraz formatowania kodu na pewno zainteresuje się podesłanymi przez Pana materiałami. Jestem początkujący i niestety ciężko jest mi złapać dobre fundamenty ten głupi błąd wyniknął u mnie z tego, że szukałem różnych implementacji tego algorytmu i widziałem kilka wersji w których przekazywany był tylko wierzchołek wejściowy, co doprowadziło do próby odtworzenia czegoś czego dobrze nie rozumiałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1