这是一篇介绍广度优先搜索的文章,网上有很多关于广度优先搜索的例子,这篇博客就当做是学习笔记吧!
图在计算机内的表示方法主要有邻接表和邻接矩阵两种。
- 邻接表:适合在稀疏图,且图的节点比较多的时候,邻接表在判断图的出度的时候比较方便,但是在判断入度的时候就需要遍历整个邻接链表来找到。邻接表存储图的空间复杂度为O(V + E)(V表示节点的个数,E则表示所有的边)
- 邻接矩阵:适合在稠密的节点比较少的图中。在判断出度,入度和判断是否存在从一个节点到另一个节点的边的时候使用比较方便;邻接矩阵存储图的空间复杂度为O(V * V).
一般情况默认使用邻接链表来存储矩阵,下面是搜索邻接链表的BFS算法。在遍历的过程中使用白色,黑色和灰色对节点进行标记:白色表示还没有访问的节点,灰色表示访问过,但是还没有将它的邻接节点访问完的节点,黑色则表示已经访问过且访问了所有它的邻接节点的节点。G(V, E)表示图,(u, v)表示从u节点到v节点的边,Vπ表示节点v的前驱节点:
BFS G(V, s) //s stands for the souce node
//at first we need to initialize all the node;
for all the vertex u in G(V, E) - {s}
u.color = white;
u.d = INT_MAX;
u.π = NULL;
s.color = grey;
s.d = 0;
s.π = NULL;
queue<node> que;
que.pus(s);
while (!que.empty())
node temp = que.front();
que.pop();
for each v in G.Adj(u)
v.color = grey;
v.d = u.d + 1;
v.π = u;
que.push(v);
temp.color = black;
这样就完成了对图的广度优先搜索遍历,事实上在遍历的过程中还可以建立个广度优先搜索树。
广度优先搜索的应用:
(1)判断一个图是不是连通的,广度优先搜索完成后,搜索到的节点包含了图上所有的节点,那么图就是连通的;
(2)寻找从一个节点到另一个节点的最短路径。