栈和深度优先搜索(DFS)

这里写图片描述
如上图:
使用 DFS 找出从根结点 A 到目标结点 G 的路径
步骤如下:
1:从根节点A开始,选择节点B的路径,继续深入,直到E,无法更进一步深入,此时栈内容为ABE
依次退栈EB
2:回溯到A节点,选择第二条路径C入栈,E入栈,但E已被访问过,弹出E,回溯到C节点;选择另一条路径
F入栈,G入栈。此时我们找到了G。此时栈内容(路径)为ACFG

总的来说,在我们到达最深的结点之后,我们只会回溯并尝试另一条路径。
注意:在 DFS 中找到的第一条路径并不总是最短的路径。例如,在上面的例子中,我们成功找出了路径 A-> C-> F-> G 并停止了 DFS。但这不是从 A 到 G 的最短路径。
结点的处理顺序是完全相反的顺序,就像它们被添加到栈中一样,它是后进先出(LIFO)。这就是我们在 DFS 中使用栈的原因。

发布了62 篇原创文章 · 获赞 14 · 访问量 1万+
展开阅读全文

DFS非递归问题不知道逻辑错在那了

02-11

``` # include<stdio.h> # include<stdlib.h> typedef struct E{ int place; //顶点下标 struct E*Pnext;//指针指向连接下一个边 }E; typedef struct{ char data[4]; //存放顶点信息 E *Phead;//链表头 }V; typedef struct{ V*v; //顶点 char *vertex;//顶点数据 int Vlen, Elen;//顶点长度//边长度 }G; typedef struct{//模拟栈 int top; E**STACK; }Stack; void found(G *g,int**sign);//创建 int LocateVex(G *g, char *t);//顶为顶点函数; void dfs(G*g, int*sign); void dfs_f(G*g, int*sign, int v); void dfs2(G*g, int*sign, int y); void printfG(G*g); int main(void) { G g; int *sign; found(&g,&sign); printfG(&g); //dfs(&g, sign); dfs_f(&g, sign, 0); system("pause"); return 0; } void found(G *g,int**sign) { int i, j, k; E*p; char v1[5], v2[5]; printf("输入你要创建多少个顶点多少个边比如(3,3):\n"); scanf("%d,%d", &g->Vlen, &g->Elen); if (!((*sign)= (int*)malloc(sizeof(int)*(g->Vlen))))exit;//动态创建数组 if (!(g->v = (V*)malloc(sizeof(V)*(g->Vlen))))exit;//动态创建边因为不懂用户需要多少个顶点和边 if (!(g->vertex = (char*)malloc(sizeof(char)*(g->Vlen))))exit;//动态创建顶点数据 printf("输入你要输入的顶点数据比如 A B C D E:\n"); for (i = 0; i < g->Vlen; i++){ scanf("%s", g->v[i].data); (*sign)[i] = 0; g->v[i].Phead = NULL; g->vertex[i] = 0; g->vertex[i] = g->v[i].data[0]; } printf("顶点数据为%s\n", g->vertex); printf("输入无向图在第A和B的边比如(a b代表a到b有边):\n"); for (k = 0; k < g->Elen; k++){//因为是无向图所有A到B有边 B到A也应该有边 scanf("%s%s", v1, v2); i = LocateVex(g, v1); j = LocateVex(g, v2); if (!(p = (E*)malloc(sizeof(E))))exit; p->place = j; p->Pnext = g->v[i].Phead; g->v[i].Phead = p; if (!(p = (E*)malloc(sizeof(E))))exit; p->place = i; p->Pnext = g->v[j].Phead; g->v[j].Phead = p; } } int LocateVex(G *g, char *t){ int i; for (i = 0; i < g->Elen; i++){ if (t[0] == g->v[i].data[0]){ return i; } } printf("没有找的匹配项:"); exit; } void dfs(G*g, int*sign){ int i; for (i = 0; i < g->Vlen; i++){ if (sign[i] != 1){ dfs2(g,sign,i); } } } void dfs2(G*g, int*sign, int y){ sign[y] = 1; E*P = g->v[y].Phead; printf("深度遍历为:%c\n", g->vertex[y]); while (P != NULL){ if (P->place > 0 && sign[P->place] != 1){ dfs2(g, sign, P->place); } else{ P = P->Pnext; } } } void printfG(G*g){ int i; for (i = 0; i < g->Vlen; i++){ E*P = g->v[i].Phead; while (P != NULL){ printf("%5d", P->place+1 ); P = P->Pnext; } printf("\n"); } } void dfs_f(G*g, int*sign, int v){//前面的没什么问题主要这断没有达到深度非递归的算法我好头疼 Stack S; E*P; S.STACK = (E**)malloc(sizeof(E*)*g->Vlen); S.top = -1; printf("深度遍历为:%c", g->vertex[v]); sign[v] = 1; S.STACK[++S.top] = g->v[v].Phead; while (S.top != -1){ P = S.STACK[S.top]; while (P != NULL){ if (sign[P->place] != 1){ printf("深度遍历为:%c", g->vertex[P->place]); sign[P->place] = 1; S.STACK[++S.top] = P; } else{ P = P->Pnext; } } S.STACK[S.top--] = NULL; } } ``` 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览