zoukankan      html  css  js  c++  java
  • 第74课 图的遍历(广度优先遍历BFS)

    广度优先相当于对顶点进行分层,层次遍历。

     

     以i为顶点对图进行广度优先遍历

    (1)三个原材料准备queue (保存图的顶点) return  (保存弹出的顶点)两个队列和一个visited数组(标记对应顶点是否访问过)

    (2)visited=0 标记初始状态每个顶点都没有访问

    (3)起始顶点压入queue队列

    (4)循环 queue队列  -----  判断队列内是否还有顶点

    (5)取出v顶点的对头元素  v=queue.front(); queeu.remove();

    (6)判断取出的对头元素v有没有访问过

    (7)没有访问----取v顶点的邻接顶点,压入queue队列

    (8)v顶点访问过了,加入return队列(ret),且标记visited[v]=true被访问

    (9)头元素v访问过了,扔掉接着算法遍历

               广度优先遍历的结果是数组

     在Graph.h中添加BFS函数:

    测试程序如下:

    复制代码
     1 #include <iostream>
     2 #include "BTreeNode.h"
     3 #include "ListGraph.h"
     4 #include "MatrixGraph.h"
     5 
     6 using namespace std;
     7 using namespace DTLib;
     8 
     9 
    10 int main()
    11 {
    12     MatrixGraph<9, char, int> g;  //实例无向图 权值未指定
    13     const char* VD = "ABEDCGFHI";
    14 
    15     for(int i=0; i<9; i++)
    16     {
    17         g.setVertex(0, VD[i]);  //设置与顶点相关联的数据元素值:北京上海  这里是ABCDEFGH
    18     }
    19 
    20     g.setEdge(0, 1, 0);  //无权值  0 代替    无向图可用有向图表示 ----> 对称的设置边
    21     g.setEdge(1, 0, 0);
    22 
    23     g.setEdge(0, 3, 0);
    24     g.setEdge(3, 0, 0);
    25 
    26     g.setEdge(0, 4, 0);
    27     g.setEdge(4, 0, 0);
    28 
    29     g.setEdge(1, 2, 0);
    30     g.setEdge(2, 1, 0);
    31 
    32     g.setEdge(1, 4, 0);
    33     g.setEdge(4, 1, 0);
    34 
    35     g.setEdge(2, 5, 0);
    36     g.setEdge(5, 2, 0);
    37 
    38     g.setEdge(3, 6, 0);
    39     g.setEdge(6, 3, 0);
    40 
    41     g.setEdge(4, 6, 0);
    42     g.setEdge(6, 4, 0);
    43 
    44     g.setEdge(6, 7, 0);
    45     g.setEdge(7, 6, 0);
    46 
    47     g.setEdge(7, 8, 0);
    48     g.setEdge(8, 7, 0);
    49 
    50     SharedPointer< Array<int> > sa = g.BFS(0);   //广度优先遍历   起始顶点是 0 号节点
    51 
    52     for(int i=0; i<sa->length(); i++)
    53     {
    54         cout << (*sa)[i] << " ";  //打印结果
    55     }
    56 
    57     cout << endl;
    58 
    59     return 0;
    60 }
    复制代码

     广度优先的本质就是层次遍历。

    结果如下:

    小结:

  • 相关阅读:
    hdoj_1016Prime Ring Problem
    毛玻璃
    HDOJ1175连连看
    const小结
    指向二维数组的指针
    关于对ACM OJ大数据递归栈溢出问题的解决方案
    Hessian的使用与介绍
    Tomcat调优
    ant使用
    ant使用
  • 原文地址:https://www.cnblogs.com/liuyueyue/p/13563238.html
Copyright © 2011-2022 走看看