广度优先搜索算法及其MATLAB实现

  • Post author:
  • Post category:其他




摘要

广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。(来自百度百科)



算法思想

1.对图中的任意的点v,标号l(v),令l = 0。

2.当所有标号为l的,与顶点u相关联的点的端点都已经标号时停止;否则把与u相关联的边的未标记的点用l+1标记,并记录这些边,记 l=l+1,重复2。



程序的参数说明

G表示图的邻接矩阵

W表示图顶点标号



MATLLAB实现

function W = BFS1(G)
 n = size(G,1);
 W = zeros(1,n);
 l = 0;
 v = 1;
 a1 = find(G(v,:) == 1);
 G(v,a1) = 2;
 G(a1,v) = 2;
 W(a1) = l + 1;
 s1 = union(a1,v);
 l = l + 1;
 while ~isempty(G == 1)
     a1 = find(G(s1,:) == 1);
     t = length(s1);
     d = [];
     for i = 1:length(a1)
         if a1(i)/t > floor(a1(i)/t)
             t2 = floor(a1(i)/t) + 1;
         else
             t2 = floor(a1(i)/t);
         end
         if isEmpty(intersect(d,t2)
             d = union(d,t2);
         end
     end
     d1 = setdiff(d,s1);
     if isEmpty(d1)
         break;
     else
         W(d1) = l + 1;
         G1 = G(s1,:);
         G1(a1) = 2;
         G(s1,:) = G1;
         G(:,s1) = G1;
         s1 = union(s1,d1);
         l = l + 1;
     end
 end`



测试

测试用例:G =

 0     1     0     0
 1     0     1     0
 0     1     0     1
 0     0     1     0

测试结果:W =

 0     1     2     3



版权声明:本文为qq_43508527原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。