图的遍历是指图从图中的某一定点出发, 按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次。
一、广度优先遍历(Breadth-First-Search,BFS)
广度优先遍历的基本思想:首先访问起始顶点v,接着由v出发,一次访问v的各个未访问过的邻接顶点w1,w2,w3,……wi,然后再依次访问w1,w2,w3,……wi的所有未被访问过的邻接顶点;再从这些访问过得顶点出发,再访问他们所有未被访问过的邻接顶点,依次类推,直到图中所有的顶点都被访问过为止。
算法的时间复杂度为O(n^2),n为顶点数
bool visited[MAX_VERTEX_NUM];//访问标记数组
void BFSTraverse(Graph G) //对图G进行广度优先遍历,设访问函数为visit()
{
for(i=0;i<G.vexnum,i++)
visited[i]=FALSE; //访问标记数组初始化
InitQuene(Q); //初始化辅助队列Q
for(i=0;i<G.vernum;i++)//从0号顶点开始遍历
if(!visited[j]) //对于每个连通分量调用依次BFS
BFS(G,i); //vi未访问过,从vi开始BFS
}
void BFS(Graph G,int v) //从顶点v出发,遍历图G,算法借助一个辅助队列Q
{
visit(v); //访问初始顶点v
visited[v]=TRUE; //对v做已访问标记
Enqueue(Q,v); //顶点v入队列
while(!isEmpty(Q))
{
DeQueue(Q,v); //顶点v出队列
for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
//检测v所有邻接点
if(!visited[w]) //w为v的尚未访问的邻接顶点
{
visit(w); //访问顶点w
visited[w]=TRUE;//对w做已访问标记
EnQueue(Q,w); //顶点w入队列
}
}
}
二、深度优先遍历
深度优先遍历的基本思想:首先访问图中某一起点v,然后由v出发,访问与v邻接且未被访问的任一顶点w1,再访问与w1邻接且为别访问的任一顶点w2,重复此过程,当不能再继续向下访问时,再依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直到图中所有顶点均被访问过。
bool visited[MAX_VERTEX_NUM]; //访问标记数组
void DFSTraverse(Graph G) //对图G进行深度优先遍历,设访问函数为visit()
{
for(v=0;v<G.vexnum,++v)
visited[v]=FALSE; //初始化已访问标记数据
for(v=0;v<G.vernum;++v)//从v=0开始遍历
if(!visited[v])
DFS(G,v);
}
void DFS(Graph G,int v) //从顶点v出发,采用递归思想深度优先遍历图G
{
visit(v); //访问初始顶点v
visited[v]=TRUE; //对v做已访问标记
for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
if(!visited[w]) //w为u的尚未访问的邻接顶点
{
DFS(G,w); //顶点w入队列
}
}