数据结构——第四章图:03图的遍历

1.图的遍历:从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中的每个顶点仅被访问一次的过程。有两种遍历方式:深度优先遍历、广度优先遍历。

2.深度优先搜索遍历图:

(1)连通图的深度优先搜索遍历:从图中某个顶点v0出发,访问此顶点,然后依次从v0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v0有路径相同的顶点都被访问到。

void DFS(Graph G, int v) //从顶点v出发,深度优先搜索遍历连通图G

{

  visited[v] = TRUE;

  VisitFunc(v);

  for (w = FirstAdjVex(G, v); w != 0; w = NextAdjVex(G, v, w))

  {

    if (!visited[w]) //对v的未访问过的邻接点w递归调用DFS

    {

      DFS(G, w); 

    }

  }

}

(2)非连通图的深度优先搜索遍历:首先将图中每个顶点的访问标志设为FALSE,之后搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一个顶点。

void DFSTraverse(Graph G, int v) //对图G做深度优先遍历

{

  for (v = 0; v < G.vexnum; ++v)

  {

    visited[v] = FLASE; //访问标志数组初始化

  }

  for (v = 0; v < G.vexnum; ++v)

  {

    if (!visited[v]) //对未访问过的顶点调用DFS

    {

      DFS(G, v);

    }

  }

}

3.广度优先搜索遍历图:从图中的某个顶点v0出发,并在访问此顶点之后依次访问v0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和v0有路径相通的顶点都被访问到。若此时图中还有顶点未被访问,则另选图中一个未曾被访问的顶点做起始点,重复上述过程,直至图中所有顶点都被访问到为止(类似于树的层序遍历)。

void BFSTraverse(Graph G, int v)

{

  for (v = 0; v < G.vexnum; v++)

  {

    visited[v] = FALSE; //初始化访问标志

  }

  InitQueue(Q); //置空的辅助队列Q

  for (v = 0; v < G.vexnum; v++)

  {  

    if (!visited[v]) //v未被访问

    {

      visited[v] = TRUE;

      visit(v); //访问v

      EnQueue(Q, v); //v入队列

      while (!QueueEmpty(Q))

      {

        DeQueue(Q, u); //队头元素出队并置为u

        for(w = FirstAdjVex(G, u); w != 0; w = NextAdjVex(G, u, w))

        {

          if (!visited[w])

          {

            visited[w] = TRUE; 

            visit(w);

            EnQueue(Q, w); //访问的顶点w入队列

          }

        }

      }

    }

  }

}

posted @ 2018-11-06 09:56  H36Phaeton  阅读(192)  评论(0编辑  收藏  举报