7.3 图的遍历

BFS、DFS

深度优先遍历(DFS)

  • 从图的某一顶点V0出发,访问此顶点;然后依次从V0的未被访问的邻接点出发,深度优先遍历图,直至图中所有和V0相通的顶点都被访问到;
    若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止
//--- 下列算法使用的全局变量 ---
Boolean visited[MAX]; // 访问标志数组
Status (* VisitFunc)(int v); // 函数变量

void DFS(Graph G, int v) {
// 从第v个顶点出发递归地深度优先遍历图G。
     visited[v] = TRUE; 
     VisitFunc(v); 
// 访问第v个顶点    
	for(w=FirstAdjVex(G,v);w!=0;w=NextAdjVex(G,v,w))
        if(!visited[w]) 
        	DFS(G, w); 
// 对v的尚未访问的邻接顶点w递归调用DFS
}
void DFSTraverse(Graph G, Status (*Visit)(int v)) {
        // 对图G作深度优先遍历。
       VisitFunc = Visit; 
      for (v=0; v<G.vexnum; ++v) 
             visited[v] = FALSE; // 访问标志数组初始化
      for (v=0; v<G.vexnum; ++v) 
            if (!visited[v]) 
            	DFS(G, v); 
             // 对尚未访问的顶点调用DFS
}

深度遍历邻接表例子

广度优先遍历(BFS)

  • 从图的某一顶点V0出发,访问此顶点后,依次访问V0的各个未曾访问过的邻接点;然后分别从这些邻接点出发,广度优先遍历图,直至图中所有已被访问的顶点的邻接点都被访问到;
    若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止
void BFSTraverse( Graph G, status (*visit )(int v ))  {
    for( v = 0; v < G.vexnum; ++v)
        visited[v] = FALSE; 
    InitQueue( Q );
    for( v = 0; v < G.vexnum;  ++ v)
       if( !visited[v] ){
          visited[v] = TRUE;
          visit( v ); 
          EnQueue( Q, v );
          while( !QuqueEmpty( Q))  {
              Dequeue( Q, u ); 
             for(w=FirstAdjVex(G,u);w;w=NextAdjVex(G,u,w))
	            if( !Visited[w] ){
	                Visited[w]=TRUE;
	                Visit( w );
	                Enqueue(Q,w);
                 }// if
	    }// while
      }// if
}// BFSTraverse
posted @ 2020-08-14 20:35  夜明_Yoake  阅读(111)  评论(0编辑  收藏  举报