【答案解析】最常见的图的遍历方式有深度优先遍历(Depth First Search,DFS)与广度优先遍历(Breadth First Search,BFS)两种。图的深度优先算法类似于树的先根遍历,图的广度优先算法类似于树的层次遍历。
DFS是从每一个顶点开始的深度优先遍历,结果都是对该分支路径深入遍历到不能再深入为止,且每个顶点只能被访问一次。具体实现过程为从图G中某个顶点v出发,先访问该结点,然后依次沿着未被访问过的v的邻接顶点进行深度优先遍历,直到图G中和顶点v之间有相连路径的其他项点都被访问过为止。此时,如果图G中还有其他顶点未被访问过,则从这些顶点中任选一个作为起始顶点,重复上述过程,直到图G中的所有顶点都被访问过为止。
例如,图1是一个无向图,假设从顶点A开始进行深度优先搜索,则可能得到如下的一个访问过程:A→B→E→C→F→H→G→D。其中,当访问到顶点E时,因为不存在未被访问过的E的邻接顶点,所以沿着原路径回溯到A(因为顶点B的所有邻接点都已经被访问过,故直接回溯到顶点A)重新开始从顶点C开始搜索,当沿着该条路径访问到顶点D时,由于不存在未被访问过的D的邻接顶点,故沿着原路径最终回溯到A,此时图中所有的顶点都已经被访问,因此该图的深度优先搜索结束。

图1 无向图
深度优先搜索算法的具体实现代码如下:
int visited[N]; ∥数组visited[]表示图中顶点的访问情况,1表示已访问,0表示未访问
void DFS(Graph G,int v)
{
visited[v]=1;
Visit(v); ∥函数Visit(v)表示对顶点v的访问
∥函数FirstAdjVex(G,v)返回图G中v的第一个邻接顶点
∥函数NextAdjVex(G,v,w)返回图G中v的(相对于w)的下一个邻接顶点,若w是v的最后一个邻接点,则返回空
for(w=FirstAdjVex(G,v),w>=0,w=NextAdjVex(G,v,w))
{
if(!visited[w])
DFS(G,w)∥对v的未被访问过的邻接顶点进行深度优先搜索
}
}
void DFSSearch((Graph G) ∥对图G进行深度优先搜索
{
for(v=0;v<G.vexnum;++v)
visited[v]=0;
for(v=0;v<G.vexnum;++v)
f(!visited[v])
DFS(G,v); ∥对未被访问过的顶点调用DFS
}
BFS也称为宽度优先算法,属于一种盲目搜索方法,是很重要的图算法的原型。其目的是逐层搜索图中的所有顶点,且保证图中的所有顶点只被访问过一次。具体过程如下:在给定图G=(V,E)中,从图G中的某个顶点v出发,访问该顶点后,依次访问所有未被访问过的v的邻接顶点,然后再沿着这些顶点出发,依次访问它们未被访问过的邻接顶点,并且保证先被访问顶点的邻接顶点先于后被访问顶点的邻接顶点而被访问。所有与顶点v有相通路径的顶点都被访问结束后,如果图G中还有其他顶点未被访问过,则从这些顶点中任选一个顶点作为起始顶点,重复上述过程,直到图G中的所有顶点都被访问过为止。
例如,图2是一个无向图,假设从顶点A开始进行广度优先搜索,则可能得到如下的一个访问过程:A→B→C→D→E→F→G→H。其中,首先依次访问A的所有邻接顶点B、C、D,然后再依次访问B、C、D的所有未被访问过的邻接顶点,