圖的深度與廣度遍歷總結如下:
#include <queue>//引用隊列結構
#include <stack>//引用棧結構
using namespace std;
#define MAX_VERTEXS 5//結點總數
queue<int> q; //聲明隊列變量
stack<int> s; //聲明棧變量
bool visited[MAX_VERTEXS] ;//聲明結點是否被訪問數組,初始值爲false
int path[MAX_VERTEXS];//聲明存儲遍歷的路徑,初始值爲-1,按照逆序輸出。
int Graph[MAX_VERTEXS][MAX_VERTEXS];//聲明圖的存儲矩陣,0表示無邊,非0表示有邊
//頂點編號從0開始
1、圖的深度遍歷(DFS)
算法描述:給定圖Graph的初態是所有頂點均未曾訪問過。在Graph中任選一頂點v爲初始出發點(源點),則深度優先遍歷可定義如下:
step1:首先訪問出發點v,並將其標記爲已訪問過;
step2:依次從v出發搜索v的未被訪問過的鄰接點w。然後以w爲新的出發點繼續搜索其未訪問過的鄰接點,
step3:直至圖中所有和源點v有路徑相通的頂點(亦稱爲從源點可達的頂點)均已被訪問爲止。
存儲結構:棧
源程序:
void DFS(int v)
{
visited[v] = true ;
cout<<"v"<< v ;
s.push(v);
while (!s.empty())
{
v = s.top();
for (int i = 0 ; i < MAX_VERTEXS; i++)
{
if (Graph[v][i] == 1 &&!visited[i]) //找到未被訪問過的鄰接頂點
{
cout << " v" << i ;
visited[i] = true ;
s.push(i);
path[i]=v;
break ;
}
}
if( i == MAX_VERTEXS)//未找到未被訪問過的鄰接頂點
s.pop();
}
}
2、圖的廣度遍歷(BFS)
算法描述:給定圖Graph的初態是所有頂點均未曾訪問過。在Graph中任選一頂點v爲初始出發點(源點),則廣度優先遍歷可定義如下:
step1:首先訪問出發點v,並將其標記爲已訪問過;
step2:依次從v出發搜索v的未被訪問的鄰接點w1,w2,w3,...wk,然後依次從w1,w2,w3,...wk出發訪問各自未被訪問的鄰接點。
step3:重複step2,直到所有頂點全部被訪問爲止。
存儲結構:隊列
源程序:
void BFS( int v)
{
int node = 0;
q.push(v);
visited[v] = true;
while( !q.empty())
{
node = q.front();//獲取隊頭元素
for ( int i = 0; i < MAX_VERTEXS; i++ )
{
if ( Graph[node][i] == 1 && !visited[i])//找到未被訪問的結點,同時將其加入到隊列中
{
visited[i] = true;
q.push(i);
path[i]=node;
}
}
cout <<" v" << node;
q.pop(); //彈出隊頭元素
}
}