【数据结构】图的遍历--深度优先搜索
来源:互联网 发布:北京java测试薪资 编辑:程序博客网 时间:2024/05/19 17:27
深度优先搜索(Depth First Search,DFS)类似于树的先序遍历,是树的先序遍历的推广。
假设初始状态是图中所有顶点未被访问,则深度优先搜索可以从图的某个顶点i出发,访问此结点,然后依次从i的未被访问的邻接点出发递归地进行同样的深度优先搜索,直至图中所有和i有路径相通的顶点都被访问到;若此时图中尚有未被访问的顶点(非连通图),则另选一个未被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到。
以上图所示的无向图为例,A作为起始点,以字母序选择邻接点(理论上可以选择任意一个邻接点,但是在实际情况下算法是在一个确定的数据结构上运行的,所以会以一种确定的顺序选择邻接点,这里选择字母序),给出遍历结果如下:
A B D C E F G H I
再给出有向图的例子,以A作为起始点,仍以字母序选择邻接点,遍历结果如下:
A B C D E F
下面分别给出对用邻接矩阵和邻接表存储的图的深度优先搜索算法的代码描述。
两种存储结构的代码描述参见之前的博文。
邻接矩阵的深度优先搜索
void DFS_M(MGraph G){ for(int i = 0; i < G->n; i++) G->Visited[i] = 0; //初始化标志数组,这一步也可以在对图进行初始化操作时执行 for(int i = 0; i < G->n; i++) if(!G->Visited[i]){ DFS(G,i); printf("\n"); }}void DFS(MGraph G, int i){ visit(G,i); for(int j = 0; j < G->n; j++){ if(G->Edges[i][j] != INFINITY && !G->Visited[j]) DFS(G,j); }}void visit(MGraph G, int i){ printf("%c ", G->Vertices[i]); G->Visited[i] = 1;}
邻接表的深度优先搜索
void DFS_ALG(ALGraph G){ for(int i = 0; i < G->n; i++) G->Visited[i] = 0; //初始化标志数组 for(int i = 0; i < G->n; i++) if(!G->Visited[i]){ DFS(G,i); //如果顶点i没被访问,则从i开始搜索一个连通分量 printf("\n"); }}void DFS(ALGraph G, int i){ EdgeNode *p; printf("%c ", G->AdjList[i].Vertex); //访问顶点i G->Visited[i] = 1; //标记i已被访问 for(p = G->AdjList[i].FirstEdge; p; p = p->Next) if(!G->Visited[p->AdjV]) //遍历顶点i的边表,如果有邻接点未被访问,则从这个顶点开始搜索 DFS(G,p->AdjV);}
0 0
- 【数据结构】图的遍历--深度优先搜索
- 数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历
- 图的遍历 深度优先搜索 广度优先搜索
- 图的遍历-深度优先搜索
- 深度优先搜索(图的遍历)
- 图的遍历 之 深度优先搜索
- 图的深度优先遍历搜索
- 图的遍历---深度优先搜索(DFS)
- 图的遍历之深度优先搜索
- 图的深度优先搜索遍历
- 图的遍历(深度优先搜索)
- 图的遍历(深度优先搜索)
- 数据结构---图的广度优先遍历和深度优先遍历
- 数据结构-图的深度优先遍历(DFS)
- 图的深度优先遍历-数据结构(20)
- 数据结构之图的深度优先搜索
- [数据结构] 图的邻接矩阵深度优先搜索
- 【数据结构】图的遍历--广度优先搜索
- uva 524
- 开始博客之旅
- [HNOI2017]单旋
- Oracle安全
- 分类游戏
- 【数据结构】图的遍历--深度优先搜索
- gdb中断点的使用
- PAT 1007. 素数对猜想
- nextDouble()取一个小数
- 解决perf在imx6q上读写PMU event counter都是零
- MFC/Halcon之halcon的安装及在vs2013中的配置
- 实现一个简略ArrayList, 提供 add(), remove(), size()
- 最长回文子串
- unit2.3 系统延迟及定时机制