Nadesłany przez Dawid Drozd, 07 maja 2011 17:19
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
przeszukiwanie_1_c.cpp:
/********************************************************
* *
* Przeszukiwanie grafu w głąb i wszerz *
* Program zostal pobrany ze strony www.algorytm.org *
* *
* Autor: Dawid Drozd *
* www.algorytm.org *
*********************************************************/
/*
* Program zawiera funkcje które pokazują jak działają spokojnie
* można je usunać.
* Polecam przeanalizować BFS a DFS różnią się może 3-4 linijkami
* głównie zamiana stosu na kolejkę
* */
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;
const int n = 7;//Rozmiar macierzy incydencji
//Funkcja pomocnicza do wizualizacji dzialania//////////////////////////
queue<int>VODWIEDZONE;//POmocniczy stos do symulacji odwiedzonych
void pokaz_odwiedzone()
{
//Jakie już odwiedziliśmy
queue<int>kopia = VODWIEDZONE;
printf("Juz odwiedzone: ");
while(!kopia.empty())
{
printf("%d ",kopia.front());
kopia.pop();
}
}
void pokaz_zawartosc_stosu_i_odwiedzone(stack<int> stos)
{
pokaz_odwiedzone();
if(stos.empty())
{
printf("\nStos PUSTY!\n");
return;
}
printf("\nZawartosc stosu:\n%d<--------- TOP\n",stos.top());
stos.pop();
while(!stos.empty())
{
printf("%d\n",stos.top());
stos.pop();
}
}
void pokaz_zawartosc_kolejki_i_odwiedzone(queue<int> kolejka)
{
pokaz_odwiedzone();
if(kolejka.empty())
{
printf("\nKolejka PUSTA!\n");
return;
}
printf("\nZawartosc kolejki: %d",kolejka.front());
kolejka.pop();
while(!kolejka.empty())
{
printf(" %d",kolejka.front());
kolejka.pop();
}
}
////////////////////////////////////////////////////////////////////////
//////////////////DFS///////////////////////////////////////////////////
void DFS(int G[n][n],int szukany)
{
stack<int> stos;
bool V[n];
for(int j=0;j<n;++j)V[j] = false;//Wierzchołki nie odwiedzone
stos.push(szukany);//Wrzucamy startujący wierzchołek na stos
while(!stos.empty())
{
pokaz_zawartosc_stosu_i_odwiedzone(stos);//Do symulacji
szukany = stos.top();
stos.pop();//Usuwamy odwiedzany element
printf("\nOdwiedzam: %d\n",szukany);
VODWIEDZONE.push(szukany);//Do symulacji odwiedzonych
V[szukany] = true;//ODwiedziliśmy już ten
for(int j = n-1;j >= 0;--j)
{
if(G[j][szukany] != 0 && V[j] == false)
{
stos.push(j);//Wrzucamy na stos jego sąsiadów
V[j] = true;//Znaznaczamy ,że go odwiedzimy!(w niedalekiej przyszłości)
//Inaczej będziemy mieli np taką sytuację w stosie 2,3,4,2 <-- 2x dwójka
}
}
}
pokaz_zawartosc_stosu_i_odwiedzone(stos);//Do symulacji
}
////////////////////////////////////////////////////////////////////////
//////////////////BFS///////////////////////////////////////////////////
void BFS(int G[n][n],int szukany)
{
queue<int> kolejka;
bool V[n];
for(int j=0;j<n;++j)V[j] = false;//Wierzchołki nie odwiedzone
kolejka.push(szukany);//Wrzucamy startujący wierzchołek na kolejke
while(!kolejka.empty())
{
pokaz_zawartosc_kolejki_i_odwiedzone(kolejka);//Do symulacji
szukany = kolejka.front();
kolejka.pop();//Usuwamy odwiedzany element
printf("\n\nOdwiedzam: %d\n",szukany);
VODWIEDZONE.push(szukany);//Do symulacji odwiedzonych
V[szukany] = true;//ODwiedziliśmy już ten
for(int j = 0;j < n;++j)
{
if(G[j][szukany] != 0 && V[j] == false)
{
kolejka.push(j);//Wrzucamy na stos jego sąsiadów
V[j] = true;//Znaznaczamy ,że go odwiedzimy!(w niedalekiej przyszłości)
//Inaczej będziemy mieli np taką sytuację w stosie 2,3,4,2 <-- 2x dwójka
}
}
}
pokaz_zawartosc_kolejki_i_odwiedzone(kolejka);//Do symulacji
}
////////////////////////////////////////////////////////////////////////
int main()
{
//Przykład ze strony: http://www.algorytm.org/algorytmy-grafowe/przeszukiwanie-grafu-wszerz-bfs-i-w-glab-dfs.html
int tab[n][n] = {
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0},
{0, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0},
{0, 0, 1, 1, 0, 1, 0},
{0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0}
};
printf("DFS\n\n");
DFS(tab,1);//Odpalamy DFS'a z wierzchołka 1
while(!VODWIEDZONE.empty())VODWIEDZONE.pop();//Czyszczenie
printf("\n\nBFS\n\n");
BFS(tab,1);//Odpalamy BFS'a z wierzchołka 1
return 0;
}

