图的深度优先遍历
深度优先搜索基本思想
- 从图中某个顶点V0出发,首先访问V0;
- 找出刚访问过的顶点的第一个未被访问的邻接点,然后访问该顶点。以该顶点为新顶点,重复此步骤,直到刚访问过的顶点没有未被访问的邻接点为止;
- 返回前一个访问过的且仍有未被访问的邻接点的顶点,找出该顶点的下一个未被访问的邻接点,访问该顶点,然后执行步骤2。
若是非连通图,则图中一定还有顶点未被访问,要从图中另选一个未被访问的顶点作为起始点,重复上述过程。
例如,连通图:
大致流程是这样的:先访问一个顶点,然后访问它的一个邻接点,然后继续访问邻接点的邻接点,直到这一条没有邻接点为止。然后回溯,查看是否每个结点的邻接点都被访问过,没有则访问,直到最后访问到I。还没有结束,再从I开始回溯,检查每个结点是否被访问,直到A结束。
深度优先算法的实现过程
- 访问出发点V0;
- 依次以V0的未被访问的邻接点为出发点,深度优先搜索图,直至图中所有与V0有路径相通的顶点都被访问。
对于非连通图,则图中一定还有顶点未被访问,要从图中另选一个未被访问的顶点作为起始点,重复上述深度优先搜索过程。
深度优先遍历V0所在的连通子图:
void DepthFirstSearch(Graph g,int V0){
//V0出发点
visit(V0);//访问出发点
visited[V0]=True;
w=FirstAdjVertex(g,V0);//找邻接点
while(w!=-1){
//邻接点未被访问过
if(!visited[w]) DepthFirstSearch(g,w);//进行DFS
w=NextAdjVertex(g