深度优先搜索(DFS)
深度优先搜索遍历类似于树的先序遍历,是树的先序遍历推广
对于一个连通图,深度优先搜索遍历过程如下:
- 从图中找某个顶点v出发,访问v
- 找出刚刚访问过的顶点的第一个未被访问的邻接点,访问该顶点。以该顶点为新顶点,重复此步骤,直到刚访问过的顶点没有未被访问的邻接点为止。
- 返回前一个访问过的且仍有未被访问的邻接点的顶点,找出该顶点的下一个未被访问的邻接点,访问该顶点
- 重复步骤2,3直到图中所有的定点都被访问过,搜索结束
对于我本人的理解,我觉得DFS的过程就是可以用“不撞南墙不回头”,要将所有的图的顶点全部遍历完
【算法实现】
- 从图中某个顶点v出发,访问v,并置visited[v]的值为true
- 依次检查v的所有邻接点w,如果visited[w]的值为false,再从w出发进行递归遍历,直到所有顶点都被访问过
代码如下:
bool visited[MVNum];
void DFS(Graph G,int v)
{
cout<<v;
visited[v]=true;
for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
{
if(!visited[w])
{
DFS(G,w);
}
}
}
深度优先搜索遍历非连通图
void DFSfun(Graph G)
{
for(v=0;v<G.vexnum;++v)
{
visited[v]=false;
}
for(v=0;v<G.vexnum;++v)
{
if(!visited[v])
{
DFS(G,v);
}
}
}
采用邻接矩阵表示图的深度优先搜索遍历
void DFS_AM(AMGraph G,int v)
{
cout<<v;
visited[v]=true;
for(w=0;w<G.vexnum;w++)
{
if((G.arcs[v][w]!=0)&&(!visited[w]))//G.arcs[v][w]!=0表示的是w是v的邻接点,若w未访问则递归调用DFS_AM
{
DFS_AM(G,w);
}
}
}
采用邻接表表示图的深度优先搜索遍历
void DFS_AL(ALGraph G,int v)
{
cout<<v;
visited[v]=true;
p=G.vertice[v].firstarc;
while(p!=NULL)
{
w=p->adjvex;
if(!visited[w])
{
DFS_AL(G,w);
p->nextarc;
}
}
}
算法分析:
当用邻接矩阵表示图时,查找每个顶点的邻接点的时间复杂度为O(n^2)其中n为顶点数,
当用邻接表作为图的存储结构时,查找邻接点的时间复杂度为O(e),e为图中边数,深度优先搜索的时间复杂度为O(n+e);