GraphMatrix::BFS广度优先搜索

38 篇文章 1 订阅
22 篇文章 0 订阅

查找某一结点的邻居:

   virtual int firstNbr(int i) { return nextNbr(i, n); } //首个邻接顶点
   virtual int nextNbr(int i, int j) //相对于顶点j的下一邻接顶点
   { while ((-1 < j) && (!exists(i, --j))); return j; } //逆向线性试探(改用邻接表可提高效率)

对于图中的所有顶点,对每一个连通区域进行BFS:

template <typename Tv, typename Te> //广度优先搜索BFS算法(全图)
void Graph<Tv, Te>::bfs(int s) { //assert: 0 <= s < n
   reset(); int clock = 0; int v = s; //初始化
   do //逐一检查所有顶点
      if (UNDISCOVERED == status(v)) //一旦遇到尚未发现的顶点
         BFS(v, clock); //即从该顶点出发启动一次BFS
   while (s != (v = (++v % n))); //按序号检查,故不漏不重
}

template <typename Tv, typename Te> //广度优先搜索BFS算法(单个连通域)
void Graph<Tv, Te>::BFS(int v, int& clock) { //assert: 0 <= v < n
   Queue<int> Q; //引入辅助队列
   status(v) = DISCOVERED; Q.enqueue(v); //初始化起点
   while (!Q.empty()) { //在Q变空之前,不断
      int v = Q.dequeue(); dTime(v) = ++clock; //取出队首顶点v
      for (int u = firstNbr(v); -1 < u; u = nextNbr(v, u)) //枚举v的所有邻居u
         if (UNDISCOVERED == status(u)) { //若u尚未被发现,则
            status(u) = DISCOVERED; Q.enqueue(u); //发现该顶点
            status(v, u) = TREE; parent(u) = v; //引入树边拓展支撑树
         } else { //若u已被发现,或者甚至已访问完毕,则
            status(v, u) = CROSS; //将(v, u)归类于跨边
         }
         status(v) = VISITED; //至此,当前顶点访问完毕
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值