图的深度与广度遍历比较

图的深度与广度遍历总结如下:

#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();  //弹出队头元素
   }   
} 
    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/hero_hegang/article/details/8801074
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞