Niech ktoś mi trzaśnie wzorcóweczkę BFS'a proszę ; )
C++


Odpowiedź :

Jeśli chodzi o przeszukiwanie wszerz to:

#include<iostream>

#include<queue>

using namespace std;

 

struct graf{

 bool kolejka; //czy dodany do kolejki

 

 vector <int> polaczenia; //do przechowywania połączeń

 // dodatkowe opcje

}*w;  

 

void odwiedz(int n)

{

 //wykonaj jakies czynnosci

 //w przypadku odwiedzenia wierzcholka o numerze n

 cout<<"Odwiedzono wierzchołek o numerze: "<<n<<endl;

}

 

void BFS(int n)

{

 queue<int> kolejka;    //utworzenie kolejki fifo

 kolejka.push(n);  //dodanie pierwszego wierzcholka do kolejki

 

 while(!kolejka.empty()) //dopóki jest cos w kolejce

 {

  n = kolejka.front(); //pobranie pierwszego elementu w kolejce

   

     kolejka.pop(); //usuń pobrany element z kolejki

     odwiedz(n); //odwiedź go i zrób coś

     //oraz dodaj wszystkie jego nieodwiedzone i nie będące  

     //w kolejce połączenia do kolejki

     for(int i=0;i<w[n].polaczenia.size();i++)

       if(!w[w[n].polaczenia[i]].kolejka)

       {

         kolejka.push(w[n].polaczenia[i]);

         w[w[n].polaczenia[i]].kolejka = 1; //oznaczenie, że dodano do kolejki

         cout<<"Dodano do kolejki wierzcholek nr "<<w[n].polaczenia[i]<<endl;

       }

 }    

}

 

int main()

{

 cout<<"Podaj liczbę wierzchołków w grafie: ";

 int n, p, a, b;

 cin>>n;

 w = new graf [n+1];//przydzielenie pamięci na wierzchołki grafu

 //wczytanie wierzchołków grafu

 cout<<"Podaj liczbę połączeń: ";

 cin>>p;

 

 for(int i=0;i<p;i++)

 {

   cout<<"Podaj numery wierzchołków, które chcesz ze sobą połączyć: ";

   cin>>a>>b;

   w[a].polaczenia.push_back(b); //połączenie jest dwukierunkowe a-->b

   w[b].polaczenia.push_back(a); //b-->a

 }

 //przeszukaj graf

 BFS(1); //rozpoczynamy od wierzchołka o numerze 1

 

 delete [] w;

 return 0;

}

Mam nadzieję, że pomogłam.