DFS 与 BFS

转载至:(https://blog.csdn.net/zhang_xiaomeng/article/details/73274259)

图的一些相关概念:
简单图(Simple graph):无环并且无平行边的图.
路(path):内部点互不相同的链。
如果无向图G中每一对不同的顶点x和y都有一条路,(即W(G)=1,连通分支数)则称G是连通图,反之称为非连通图。
两端点相同的路(即闭路)称为圈(cycle)。
树(tree)是无圈连通无向图。树中度数为1的结点称为树的叶结点。树中度数大于1的结点称为树的分支节点或内部结点。
不相交的若干树称为森林(forest),即森林的每个连通分支是树。
定理1:T是树<=>T中无环,且任何不同两顶点间有且仅有一条路。
定理2:T是树<=>T连通且|e|=n-1,|e|为T的边数,n为T的顶点数。
由根到某一顶点v的有向路的长度,称为顶点v的层数(level)。根树的高度就是顶点层数的最大值。

生成子图:若G1包含于G,且V1=V,则称G1是G的生成子图或支撑子图。
如果T是G的一个生成子图而且又是一棵树,则称T是图G的一棵生成树(spanning tree)或支撑树。
生成树T中的边称为树T的树枝(branch),不在生成树T中的G的边,称为树T的弦(chord)
定理1:图G有生成树<=>G为连通图。

/*
用 DFS 求连通块,可以用八条DFS 调用 或者是 常量数组,又称为 种子填充
用 BFS 求最短路,节点的访问顺序恰好是他们到根结点距离从小到大的顺序
DFS 用递归实现,BFS 用队列实现
*/

深度优先搜索:(DFS)
求连通简单图G的一棵生成树的许多方法中,深度优先搜索(depth first search)是一个十分重要的算法。
基本思想:
任意选择图G的一个顶点v0作为根,通过相继地添加边来形成在顶点v0开始的路,其中每条新边都与路上的最后一个顶点以及不在路上的一个顶点相关联。继续尽可能多地添加边到这条路。若这条路经过图G的所有顶点,则这条路即为G的一棵生成树;若这条路没有经过G的所有顶点,不妨设形成这条路的顶点顺序v0,v1,……,vn。则返回到路里的次最后顶点v(n-1).若有可能,则形成在顶点v(n-1)开始的经过的还没有放过的顶点的路;否则,返回到路里的顶点v(n-2)。然后再试。重复这个过程,在所访问过的最后一个顶点开始,在路上次返回的顶点,只要有可能就形成新的路,知道不能添加更多的边为止。
深度优先搜索也称为回溯(back tracking)
用深度优先搜哦所来找出图3-9所示图G的生成树,任意地从顶点d开始,生成步骤显示在图3-10。
这里写图片描述
广度优先搜索:
可用广度优先搜索(breadth first search)来产生连通简单图的生成树。
基本思想:
从图的顶点中任意第选择一个根,然后添加与这个顶点相关联的所有边,在这个阶段添加的新顶点成为生成树里1层上的顶点,任意地排序它们。下一步,按照顺序访问1层上的每一个顶点,只要不产生回路,就添加与这个顶点相关联的每个边。这样就产生了树里2的上的顶点。遵循同样的原则继续下去,经有限步骤就产生了生成树。
用广度优先搜索找出图3-9所示图G的生成树,选择顶点f作为根。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/jkdd123456/article/details/80273387