图的深度优先遍历搜索

图的深度优先搜索遍历类似于树的先根遍历,是树先根遍历的推广。

算法描述:

从图中的某节点v开始访问,访问他的任意一个邻结点w1;再从w1出发,访问与w1邻接但是没有被访问过的结点w2;然后再从w2出发,进行类似的访问,。。。如此进行下去,直至所以的邻接结点都被访问过位置,接着,退回一步,退回到前一次刚访问过的结点,看是否还有其他没有被访问的邻接结点。如果有,则访问此结点,只后再从此结点出发,进行与前述类似的访问。重复上述过程,直到连通图中所以结点都被访问过为止。遍历的过程是一个递归的过程。

《图的深度优先遍历搜索》  

如上图的深度优先搜索遍历的整个过程描述如下:假定v1是出发点,首先访问v1.v1有两个邻接点v2v3均未被访问过,选择访问节点v2,再找v2的未被访问过的邻接点v4v5,选择访问结点v4.重复上述搜索过程,依次访问结点v8v5.v5被访问过,由于与v5相连的顶点均被访问过,搜索退回到v8v8的邻接点v4v5也被访问过;同理依次退回结点v4v2,最后退回到结点v1.这时选择结点v1的未被访问过的邻接点v3,继续搜索,依次访问结点v3v6v7从而遍历途中全部结点。

 

算法实现:

//对图进行深度优先遍历

public Interator DFSTraverse(Vertex v){

         LinkedList traverseSeq = new LinkedListListDLNode();

         resetVexStatus();//重置结点状态

         DFS(v,traverseSeq);//v点出发深度优先遍历搜索

         Iterator it = getVertex();//从图中未曾访问的其他结点出发重新搜索

         for(it.first;!it.isDone;it.next()){

                   Vertex u = (Vertex)it.currentItem();

                   If(!u.isVisited())

                            DFS(u,traverseSeq);

}

return traverseSeq.elements();

}

//深度优先的递归算法

private void DFS(Vertex v,LinkedList list){

         v.setToVisited();

         list.insetLast(v);

         Iterator it = adjVertexs(v);//取得结点v的所有邻接点

         for(it.first();!it.isDone();it.next()){

                   Vertex u = (Vertex)it.currentItem();

                   If(!u.isVisited()){

         DFS(u,list);

}

}

}

深度优先搜索算法在搜索过程中不考虑各个边的开销,只考虑路径的选择,基本思路是:站在一个连通图的的一个节点上,然后尽可能的沿着一条边深入,当遇到死角时回溯,然后继续搜索,直到搜索到目的节点为止,深度优先一般使用栈结构实现。

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