图的基本算法(二、广度优先搜索)

来源:互联网 发布:电子阅读器知乎 编辑:程序博客网 时间:2024/06/01 10:17

广度优先搜索是最简单的图搜索算法之一;在Prim 最小生成树算法和Dijkstra 单源最短路径算法中都采用了广度优先搜索的类似思想;

—————————————————————————————————————————————————

在给定图G = (V, E)和一个特定的源顶点s 的情况下,广度优先搜索系统的探索G 中的边,以其“发现”可以从s 到达的所有顶点,并计算s 到所有这些可达顶点之间的距离(即最少的边数);同时还能生成一棵根为s、且包括所有s的可达顶点的广度优先树;

—————————————————————————————————————————————————

对从s可达的任意顶点v,广度优先树中从s到v的路径对应于图G中从s到v的一条最短路径;该算法对有向图、无向图同样合适; 

—————————————————————————————————————————————————

算法会首先发现和s距离为k的所有顶点,才会发现距离为k+1的其他顶点;

—————————————————————————————————————————————————

在算法中用3中颜色区分点;如果(u,v)存在,且顶点u为黑色,则顶点v为黑色或者是灰色;也就是说,与黑色相邻的点都是被发现了的;而灰色的顶点可能会有一些白色的相邻的顶点,它们代表了已发现与未发现的顶点的边界;

—————————————————————————————————————————————————

对于每个顶点u ∈V,其色彩存储于变量color[u]中, u的父母存于变量π[u]中,如果u没有父母(例如u = s或者是尚未被发现),则π[u] = NIL.该算法计算出来的源顶点s 和顶点u之间的距离存于d[u]中;算法还涉及了一个先进先出队列Q来管理所有的灰色顶点;

广度优先搜索伪代码:


入队和出队操作只需要O(1)的时间,因此队列操作的总时间为O(V); 因为只有当每个顶点将出队列时,才会扫描其邻接表,因而每个顶点的邻接表至多被扫描一次,由于所有邻接表的长度之和Θ(E),故扫描所有邻接表所花费的全部时间为O(E).初始化时间为O(V),于是BFS过程的总的运行时间为O(V + E)

—————————————————————————————————————————————————



—————————————————————————————————————————————————



 

 

原创粉丝点击