电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

图 - 图的遍历 - 深度优先遍历(二)


发布日期:2018/4/2
 

深度优先遍历的递归算法

()深度优先遍历算法

typedef enum{FALSETRUE}Boolean;//FALSE为TRUE为

Boolean visited[MaxVertexNum]; //访问标志向量是全局量

void DFSTraverse(ALGraph *G)

{ //深度优先遍历以邻接表表示的图G而以邻接矩阵表示G时算法完全与此相同

int i;

for(i=;in;i++)

visited[i]=FALSE; //标志向量初始化

for(i=;in;i++)

if(!visited[i]) //v i 未访问过

DFS(Gi); //以v i 为源点开始DFS搜索

}//DFSTraverse

()邻接表表示的深度优先搜索算法

void DFS(ALGraph *Gint i){

//以v i 为出发点对邻接表表示的图G进行深度优先搜索

EdgeNode *p;

printf(visit vertex%cG>adjlist[i]vertex);//访问顶点v i

visited[i]=TRUE; //标记v i 已访问

p=G>adjlist[i]firstedge; //取v i 边表的头指针

while(p){//依次搜索v i 的邻接点v j 这里j=p>adjvex

if (!visited[p>adjvex])//若v i 尚未被访问

DFS(Gp>adjvex);//则以V j 为出发点向纵深搜索

p=p>next; //找v i 的下一邻接点

}

}//DFS

()邻接矩阵表示的深度优先搜索算法

void DFSM(MGraph *Gint i)

{ //以vi为出发点对邻接矩阵表示的图G进行DFS搜索设邻接矩阵是l矩阵

int j;

printf(visit vertex%cG>vexs[i]);//访问顶点v i

visited[i]=TRUE;

for(j=;jn;j++) //依次搜索v i 的邻接点

if(G>edges[i][j]==&&!visited[j])

DFSM(Gj)//(v i v j )∈E且v j 未访问过故v j 为新出发点

}//DFSM

注意

遍历操作不会修改图G的内容故上述算法中可将G定义为ALGraph或MGraph类型的参数而不一定要定义为ALGraph和MGraph的

指针类型但基于效率上的考虑选择指针类型的参数为宜

上一篇:交换排序之快速排序

下一篇:图 - 图的遍历 - 深度优先遍历(三)