Odnajdowanie najkrótszej drogi w grafie - problem

0

Jestem w trakcie pisania kodu w którym przeszukuję graf w szerz w celu znalezienia najkrótszej drogi, ale mam problem ponieważ przy if w zagnieżdżonej pętli for w while wyskakuje mi taki komunikat Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

#include <iostream>
#include <vector>
#include <queue>

using namespace std;
void zerowanie_tab(int *T,int n)
{
    for(int i=0; i<n; i++)
    {
       T[i] = 0;
    }
}


int main()
{
 int n,m,x,y,v,u,p;//n-liczba wierzcholkow, m-liczba krawedzi
  cin>>n;
  cin>>m;
  vector <int> tab[n]; //tablica n pustych wektorów
  int * L = new int[n]; //tablica która przechowuje, czy wierzcholek byl juz odwiedzony
  int * F = new int[n]; //tablica która przechowuje, skąd przysliśmy
  
    queue<int> Q; //kolejka, do której wkładamy sąsiadów aktualnie przetwarzanego wierzchołka.
    
    zerowanie_tab(L, n);
    zerowanie_tab(F, n);
   
  for(int i=0;i<m;i++)
  {
      cin>>x;//pierwszy wierzcho³ek krawêdzi
      cin>>y;//drugi wierzcho³ek krawedzi
      tab[x].push_back(y); //dodaj krawedz wychodzaca dla wierzcholka
      tab[y].push_back(x);
  }
  
    
    cin>>v;
    cin>>u;
    Q.push(v); L[v] = true;
    
    while(!Q.empty())
    {
        p = Q.front();
        Q.pop();
        
        for(int i=0; i<tab[p].size(); i++)
        {
         
            if(!L[tab[p][i]])
            {
            cout<<tab[p][i];
            Q.push(tab[p][i]);
            L[tab[p][i]] =true;
            F[tab[p][i]] = p;
            }
            }
        
    }
    
    
  
    for(int i=u; i>=v; i--)
    {
        
        {
        cout<<F[i]<<" ";
        }
    }
 
   
    delete [] L;
    delete [] F;
    return 0;
   
}

3

Dlaczego używasz new skoro wyraźnie widać, że wiesz o istnieniu czegoś takiego jak vector? To samo do tablicy - VLA nie jest częścią C++, użyj wektora wektorów. Wtedy też nie trzeba będzie się bawić w wymyślanie koła na nowo w postaci reimplementacji memset/std::fill.

Co do samego problemu: wypadałoby podać dane dla jakich masz problem. I pobawić się debuggerem.

5

Na marginesie:

  1. vector <int> tab[n]; //tablica n pustych wektorów - komentarze powinny opisywać to, czego nie da się (szybko) domyślić. Przecież widzę, że to tablica, nie potrzebuję do tego wytłumaczenia.
  2. int * L = new int[n]; - skoro ta tablica przechowuje binarną informację czy, dlaczego int a nie bool?
  3. //tablica która przechowuje, czy wierzcholek byl juz odwiedzony - nazwij zmienną is_node_visited i usuń ten komentarz.
  4. //tablica która przechowuje, skąd przysliśmy - nazwij zmienną np. node_parent i usuń komentarz.
  5. //n-liczba wierzcholkow - nazwij zmienną vertex_count i usuń komentarz.
  6. //m-liczba krawedzi - nazwij zmienną edge_count i usuń komentarz.
0

Używam zwykłej tablicy, bo z wektorami nie miałem jeszcze za dużo do czynienia. Profesor od algorytmów używa ich w swoich programach i bazując na jego programie i tego co przeczytałem na internecie użyłem tych dwóch wektorów, ale niezbyt rozumiem jak działają wektory dwuwymiarowe, tablicę jest mi łatwo sobie wyobrazić jako macierz, a wektory nie wiem do czego mogę porównać. Spróbuję pozmieniać te tablice na wektory i zobaczę czy działa. Progam nie działał dla takich danych.

10 11
1 2
2 3
3 4
2 4
1 5
1 9
9 10
5 6
5 7
5 8
8 10

1

Masz off-by-one w danych wejściowych: powinieneś iterować wierzchołki od zera, nie od jedynki.

a wektory nie wiem do czego mogę porównać

Wektor to tablica na sterydach (z automatycznie zarządzaną pamięcią).

0

Próbuję zmienić to na wektory, ale nie wiem jak przekazać vector do funkcji. Chciałbym vector odwiedzin ustawić na fałsz, a vector rodzica na -1, a nawet mi się nie kompiluje.

#include <iostream>
#include <vector>
#include <queue>

using namespace std;
void to_false(vector<bool>& T,int n)
{
    for(int i=0; i<n; i++)
    {
       T[i] = false;
    }
}

void minus_one(vector<int>& T, int n)
{
    for(int i=0; i<n; i++)
    {
       T[i] = -1;
    }
}

int main()
{
  int vertex_count, edge_count,first_vertex, second_vertex, i;
  
    
  cin>>vertex_count;
  cin>>edge_count;
  vector <int> tab[vertex_count];
  vector <bool> is_node_visited[vertex_count];
  vector <int> node_parent[vertex_count];
  queue<int> Q;
    
    for(i=0; i<edge_count; i++)
    {
        cin>>first_vertex;
        cin>>second_vertex;
        tab[first_vertex].push_back(second_vertex);
        tab[second_vertex].push_back(first_vertex);
    }
    
    to_false(is_node_visited, vertex_count);
    minus_one(node_parent, vertex_count);
    
    return 0;
0

Mam kolejny problem.
Przy takich danych:
6
7
0 4
0 1
1 2
1 4
2 3
3 4
3 5
0 5

Wyskakuje mi taki problem jak na załączonym screenie. Poniżej kod:

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

void to_false(vector<bool>& T,int n)
{
    for(int i=0; i<n; i++) T[i] = false;
}

void minus_one(vector<int>& T, int n)
{
    for(int i=0; i<n; i++) T[i] = -1;
}

void bfs(vector <vector <int>>&T, vector<bool>&is_node_visited, vector<int>&node_parent, int s, int e, queue<int>Q)
{
    int p=s;
    is_node_visited[p] = true;
    Q.push(p);
    
    while(!Q.empty())
    {
        p = Q.front();
        Q.pop();
        
        for(int i=0; i<T.size(); i++)
        {
            if(!is_node_visited[T[p][i]])
            {
                Q.push(T[p][i]);
                is_node_visited[T[p][i]] = true;
                node_parent[T[p][i]] = p;
            }
        }
    }
    
    for(int i=e; i>=s; i--)
    {
        cout<<node_parent[i]<<" ";
    }

}



int main()
{
  int vertex_count, edge_count,first_vertex, second_vertex, start, end, i;
  
    
  cin>>vertex_count;
  cin>>edge_count;
  vector <vector <int>> tab(vertex_count);
  vector <bool> is_node_visited(vertex_count);
  vector <int> node_parent(vertex_count);
  queue<int> Q;
    
    for(i=0; i<edge_count; i++)
    {
        cin>>first_vertex;
        cin>>second_vertex;
        tab[first_vertex].push_back(second_vertex);
        tab[second_vertex].push_back(first_vertex);
    }
    
    to_false(is_node_visited, vertex_count);
    minus_one(node_parent, vertex_count);
    
    cin>>start;
    cin>>end;
    
    bfs(tab, is_node_visited, node_parent, start, end, Q);
    
    return 0;
   
0

Skąd wiesz, że np. tu:

if(!is_node_visited[T[p][i]])

... T[p][i] nie jest "przypadkiem" równe -1? Nigdy tego nie sprawdzasz.

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