图的遍历即从其中的一个顶点出发,沿着一些边访问图中所有的顶点,且每个顶点只访问一次。图的遍历可以通过两种方法来实现:即深度优先搜索(Deth First Search)和广度优先搜索(Breadth First Search).这两种方法基于不同的思想,先来介绍DFS的思想。
深度优先搜索是一种递归的过程,有回退。
1:对于一个无向连通图而言,在访问图中的某一起始顶点V后,由V出发,访问它的某一个邻接顶点W1;
2:再从W1出发,进行类似1的访问……直至访问到wi,而Wi正好无节点访问时暂停。
3:接着,回退一步至前一次被访问的节点Wi-1,看是否有其他未被访问过的邻接结点,若果有再重复步骤2,否则在回退。
4,重复上述过程,直至该连通图中所有顶点都被访问过为止。
DFS算法的实现:
在实现DFS(v)函数中,实现从顶点v出发访问它所有未访问过的邻接结点需要在DFS算法中设置一个visited[n]的标记数组来存储和标记各顶点的访问状态,设visited[i]=1,表示顶点i被访问过;visited[i]=0,则表示顶点i还未被访问。初始化visited[n]={0};
若图是用邻接表存储的,则实现如下:
DFS(顶点i) //从顶点i进行深度优先搜索
{
visited[i]=1; //将顶点i的访问标志置为1
p=顶点i的边链表表头指针;
while(p不为空)
{
//设指针p所指向的边结点所表示的边中,另一个顶点为顶点j
if(j未被访问过)
{
//递归搜索前的准备工作;
DFS(顶点j);
//以下是DFS回退的位置;
}
p=p->nextarc; //p移向下一个边结点
}
}
若图是用邻接矩阵存储的,则实现如下:
DFS(顶点i) //从顶点i进行深度优先搜索
{
visited[i]=1; //将顶点i的访问标志置为1
for(int j=0;j<n;j++) //对其它所有顶点j
{
//j是i的邻接顶点,且顶点j没有被访问过
if(Edge[i][j]==1&&!visited[j])
{
//递归搜索前的准备工作;
DFS(j);
//DFS的回退位置;
}
}
}