DFS (Depth First Search)
Przykład badania spójności grafu nieskierowanego przy pomocy funkcji DFS - z wykorzystaniem stosu.
Poniższy program stanowi realizację zadania omawianego na lekcji.
Zakładamy, że wszystkie wierzchołki w grafię będą numerowane w sposób ciągły (1,2,3...) oraz pierwszy wierzchołek na numer "1".
Zadaniem zmiennej maxW jest zapamiętanie najwyższego numeru wierzchołka (do tej wartości będziemy przegladać tablicę odwiedzonych po wykonaniu funkcji DFS).
Program w pierwszej kolejności wczytuje dane (opis grafu) w formie opisu krawędzi:
- n - ilość krawędzi;
- a b - wiechołki połączone krawędzią.
Przykładowe dane
Na podstwie wczytanego opisu grafu program buduje listę sąsiedztwa (wektor V). W celu sprawdzenia poprawności nasza lista sąsiedztwa jest wypisywana na ekran:
- pobiera ze stosu numer wiechołka - zapis do zmiennej "w",
- usuwa ze stosu wierzochołek,
- uruchamia funkcję DFS z parametrem "w".
Kiedy stos (S) zostanie opróżniony przeglądamy listę odwiedzonych. Jeżeli dla wszystkich wiechołków otrzymaliśmy wynik pozytywny wypisujemy komunikat informujący, że badany graf jest spójny.
-
#include<iostream>
-
#include<stack>
-
#include<vector>
-
using namespace std;
-
-
void DFS(int);
-
-
vector <int> V[20];
-
stack <int> S;
-
bool odw[100];
-
int maxW=0; //max numer wierzcholka
-
-
int main()
-
{
-
int n,a,b;
-
cin>>n;
-
//wczytujemy dane - budujemy liste sasiedztwa
-
for (int i=0;i<n;i++)
-
{
-
cin>>a>>b;
-
maxW=max(maxW,a);
-
maxW=max(maxW,b);
-
V[a].push_back(b); V[b].push_back(a);
-
}
-
//sprawdzenie listy sasiedztwa - max 20 wierzcholkow
-
cout<<"\nLista sasiedztwa";
-
for (int i=1 ; i<=maxW ; i++)
-
{
-
cout<<"\n"<<i<<" -> ";
-
for (int j=0 ; j<V[i].size() ; j++)
-
cout<<V[i][j]<<" ";
-
}
-
-
//badanie spojnosci grafu
-
DFS(1);
-
bool spojny=true;
-
for (int i=1 ; i<=maxW ; i++)
-
if (!odw[i]) spojny=false;
-
-
if (spojny)
-
cout<<"\nTen graf jest spojny";
-
else
-
cout<<"\nTen graf nie jest spojny";
-
-
}
-
-
void DFS(int k)
-
{
-
int x,w;
-
odw[k]=true;
-
for ( int i=0 ; i<V[k].size() ; i++ )
-
{
-
x=V[k][i];
-
if (!odw[x])
-
S.push(x);
-
}
-
if (!S.empty())
-
{
-
w=S.top();
-
S.pop();
-
DFS(w);
-
}
-
}
-
-