数据结构——图的遍历

图的遍历:从一个已知顶点开始,搜索所有可到达的顶点。

两种常用方案:

   (i) Breadth first search,BFS  

   (ii)depth first search, DFS .

一般采用深度优先算法 DFS,其效率更高。

(i) 图的广度优先搜索,BFS

    类似与二叉树的层次遍历。用一个队列实现。

BFS示例代码:

virtual void bfs (int v, int reach[], int label)
{//BFS, reach[i] 用来标记从顶点i可以到达的所有顶点
 arrayQueue<int> q(10);
 reach[v] = label;
 q.push(v);
 while (!q.empty())
 {
  //从队列中删除一个标记过的顶点
  int w =q.front;
  q.pop();
 
  //标记所有没有到达的临接于顶点w的顶点
  vertexIterator<T> *iw = iterator(w);
  int u;
  while ((u = iw->next()) != 0)
  {//访问顶点w的一个相邻顶点
   if (reach[u] ==  0)
   {//u 是一个没有到达过的顶点
    q.push(u);
    reach[u] = label; //做到达标记
   }
  }
  delete iw;
 }
}

时间复杂度分析:

  对于不同存储方式有不同的时间复杂度。

 1.临接矩阵

    O(n^2)

 2.临接链表

    O(n+e) = 找临接顶点开销是O(e) + 初始化各个顶点的label开销是O(n);

(ii)图的深度优先搜索, DFS

   类似与二叉树的前序遍历。

   递归写法非常地简单。

   伪代码:

   depthFirstSearch(v)

   {

    Label vertex v as reached.

    for(each unreached vertex u adjacent from v)

     depthFirstSearch(u);

   }

  时间复杂度与BFS类似

 1.临接矩阵

   O(n^2)

 2.临接链表

   O(n+e)

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/ZDF19/article/details/53559047
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞