如题 自用笔记 如有错误欢迎及时指正
目录
网上搜到的算法实现大多都在访问顶点前后出入栈的处理上有错误或者小问题,代码风格也不尽统一,十分容易带来学习误区,遂总结之。话不多说,直接上代码,文末给出测试环境。
递归方法见下文:图的BFS与DFS算法在邻接矩阵与邻接表存储结构下实现_kollektor的博客-优快云博客
伪代码描述
非递归实现DFS
(1)栈S初始化;visited[n]=0;
(2)访问顶点v;visited[v]=1;顶点v入栈S
(3)while(栈S非空)
x=栈S的顶元素(不出栈);
if(存在并找到未被访问的x的邻接点w)
访问w;visited[w]=1;
w进栈;
else
x出栈;
邻接矩阵下实现非递归DFS
//DFS_NoRecur
void DFS_NoRecur(MatrixGraph G,int u){
SqStack S; //辅助栈
InitStack(S);
int v; //负责保存出栈顶点下标 v
int w; //w负责找出栈顶点的邻接点 和判定便存在性
/*开始DFS过程*/
printf("%d->", G->Vex[u]); //访问
visited[u] = true; //访问标记
Push(S, u); //入栈
while (!StackEmpty(S)){
GetTop(S, v); //取出栈顶 v保存 此处不可以直接出栈!!!
for (w = 0; w < G->vexnum; w++){ //寻找或访问v的邻接点w
if (!visited[w]&&G->Edge[v][w]!=INF){ //存在并找到未被访问的v的邻接点w=p->adjvex
printf("%d->", G->Vex[w]); //访问
visited[w] = true; //做标记
Push(S, w); //入栈
}else{
Pop(S, v); // v出栈
}
} // for
}// while
/*结束DFS过程*/
}
//DFSTraverse_NoRecur
void DFSTraverse_NoRecur(MatrixGraph G){
memset(visited, false, MAX_VEX_NUM);
int v;
for (v = 0; v < G->vexnum; v++){
if(!visited[v]){
DFS_NoRecur(G, v);
}//if
} // for
printf("^\n");
}
<