图的广度优先搜索

来源:互联网 发布:线刷宝安全优化版 编辑:程序博客网 时间:2024/06/07 20:25

广度优先搜索(Breadth-First-Seracj)BFS,BFS是一种分层的查找过程,每向前走一步可访问一批顶点,不像深度优先搜索,它不是一个递归的算法,为了实现逐层访问,需要用到一个辅助的队列。(注:这一段话来自于书上的)

个人理解广度优先可以参考树的层次遍历,只不过树的层次非常好理解,只要画出树的结构层次也就很明显,而图的层次结构不是太明显,怎么去更好的表达还没想出太好的办法,可谓只可意会不可言传,也许深入细节后可能会有新的表达,届时再继续探讨。本次文章只探讨BFS的思想,不深入了解细节,原因是现在对图的存储结构还有点没弄透彻,等到实现的时候再做更深的阐述。废话不多说,算法描述如下:

bollean visited[max];//访问标记数组Queue Q;//用到的复制队列vexs[];//顶点数组arc[][];//边数组void BFSTraverse(Graph G){for(i=0;i<G.vexs.length;i++){visisted[i] = false;}//初始化标记数组for(i=0;i<G.vexs.legth;i++){if(!visisted[i]){BFS(G,i);}}//for}//BFSTraversevoid BFS(Graph G,int v){visit(v);visited[v] = true;Q.add(v);while(!Q.empty()){v = Q.poll();for(j=0;j<G.vexs.length;j++){if(G.arc[i][j]==1 && !visited[j]){visited[j] = true;visit(G.vexs[j]);Q.add(j);}}}//while}//BFS

需要提醒一下初学者的是:图的存储采用的邻接矩阵(共两个数组,一个vexs[]是用来存储节点的一个是arc[][]是用来存储边关系的),本人当时就是这里不太清楚导致理解算法时费了很大的功夫。

BFSTraverse比较好理解,只做了两件事情。第一初始化访问控制数组,第二就是对每个节点(未访问过的)调用BFS

BFS算法已很好理解,就是遇到一个节点,先访问然后入队,当队列不空时,出队,去访问这个节点的边关系数组arc[]i[j],注意此时i是定值,然后访问这个顶点入队。

0 0
原创粉丝点击