圖的深度與廣度遍歷比較

圖的深度與廣度遍歷總結如下:

#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();  //彈出隊頭元素
   }   
} 
發佈了40 篇原創文章 · 獲贊 8 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章