下面是教材上关于深度优先遍历的伪代码;
1:访问顶点;visited[v]=1;
2:w=顶点v的第一个邻接点;
3:while(w存在) //1
{
3.1 if(w未被访问)
从w出发递归执行深度优先遍历算法 //2
3.2 w=v的下一个邻接点 //3
}
由于图的复杂性,对于不同的图采用算法一般不同
下面是关于无向图的深度优先算法的进一步描述:
void MGraph::DFSTraverse(int v)
{
count<<vertex[v]:
visted[v]=1;
for(j=0;j<vertexnum;j++) //4
{
if(arc[v][j]==1&&visited[j]==0) //5
DFSTraverse(j); //6
}
}
如何去理解这个算法呢?
我们知道采用深度,还是广度,主要是为了解决图的遍历过程中的如何确定下一个访问顶点问题,此处已经指明,剩下的是:1中的w表示什么?2中在程序中起什么作用?3中那个赋值语句怎么理解?上面两个算法实际上是对对同一问题的
描述,但是如何理解4下面的语句块?事实上上述两个算法虽然是对同一算法的描述,但算法1的抽象级别高于算法2
类似于树的前序遍历,1处的循环使得处在递归最外层与顶点w邻接的点被访问,即不管邻接点的邻接点(递归的内层)是怎样的复杂,它总使得w的外层邻接点被访问,如何实现的呢?递归是个好东西,这个过程中,通过循环,递归的i层邻
接点的l若干个邻接点i1,i2……都被递执行,通过递归在确定了访问i层的某一邻接点后,犹如破竹,访问它的纵向邻接点……这时执行的结果是形成了局部的路径,不妨称之为“访问链”;当这个链结束后,3处的语句开始执行了……
而在第二个算法中,for循环起着什么作用呢?
在算法一中,那个while循环是抽象的描述,而这里才是更接近与计算机执行过程的描述,for循环在这里起的作用是当执行到了递归的i层时,它负责寻找顶点vi 判定表达式5所述的邻接且未被访问的顶点,这里所说的顶点对于vi来说是与它之间存在一条边的所有点, 语句6在这里起到的作用等效于语句3,即在递归的第vi层纵向访问完后,开始回到vi寻找vi的下一个符合要求的邻接点