图-图的遍历

广度优先遍历(BFS)

  • 过程分析
    • 初始化一个队列。访问A顶点,将A顶点入队,之后出队。同时将与A顶点相邻接的顶点B,F入队
    • 访问B结点,将B结点出队,同时将与B结点相邻接,且还未被访问过的顶点C,I,G入队

    • 访问F结点,将F结点出队,同时将于F结点相邻接,且还未被访问过的顶点G,E入队。之后同理,直到队列为空。所得的出队序列就是遍历序列
  • BFS代码
    •  1 bool visited[MaxVertexNum];        //访问标记数组
       2 //邻接矩阵的广度遍历算法
       3 void BFSTraverse(MGraph G)
       4 {
       5     Queue Q;    //辅助队列
       6     for (int i = 0; i < G.vexnum; i++)
       7     {
       8         visited[i] = false;    //访问标记数组初始化
       9     }
      10     InitQueue(Q);    //初始化辅助队列
      11     for (int i = 0; i < G.vexnum; i++)    //从0号顶点开始遍历
      12         if (!visited[i])    //对每个连通分量调用一次BFS
      13             BFS(G, i);    //Vi未访问过,从Vi开始BFS
      14 }
      15 
      16 void BFS(MGraph G, int v)
      17 {
      18     //从顶点v出发,广度优先遍历图G,算法借助一个辅助队列Q
      19     visit(v);    //访问结点v
      20     visited[v] = true;    //对v做访问标记
      21     Enqueue(Q, v);        //顶点v入队列
      22     while (!isEmpty(Q))
      23     {
      24         Dequeue(Q, v);        //顶点v出队
      25         for (int w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w))//检测v所有的邻接点
      26         {
      27             if (!visited[w])    //w为v还未访问过的邻接结点
      28             {
      29                 visit(w);    //访问顶点w
      30                 visited[w] = true;    //对顶点w做访问标记
      31                 Enqueue(Q, w);        //将顶点w入队
      32             }
      33         }
      34     }
      35 }

深度优先遍历(DFS)

  • 过程分析:首先访问图中某一起始顶点v,然后由v出发,访问与v邻接且未被访问的任一顶点w1,再访问与w1邻接且未被访问的任一顶点w2,....重复上述过程。当不能再继续访问的时候,依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该顶点开始继续上述搜索过程,直到图中所有顶点均被访问过为止。
  • DFS代码
    •  1 /*深度优先遍历算法*/
       2 bool visited[MaxVertexNum];        //访问标记数组
       3 void DFSTraverse(MGraph G)
       4 {
       5     for (int v = 0; v < G.vexnum; ++v)
       6         visited[v] = false;        //初始化访问标记数组
       7     for (int v = 0; v < G.vexnum; ++v)    //从顶点0开始遍历
       8     {
       9         if (!visited[v])        //顶点v还问访问过,则访问
      10             DFS(G, v);
      11     }
      12 }
      13 
      14 void DFS(MGraph G, int v)
      15 {
      16     //从顶点v出发,采用递归思想,深度优先遍历图
      17     visit(v);
      18     visited[v] = true;
      19     for (int w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w))//检测v所有的邻接点
      20         if (!visited[w])
      21         {
      22             DFS(G, w);
      23         }
      24 }

猜你喜欢

转载自www.cnblogs.com/KBryant/p/11617232.html