zoukankan      html  css  js  c++  java
  • GraphMatrix::BFS广度优先搜索

    查找某一结点的邻居:

       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; //至此。当前顶点訪问完成
       }
    }
  • 相关阅读:
    第十五次-语法制导的语义翻译
    第十四次--算符优先分析
    第十二次-递归下降语法分析
    第十一次-LL(1)文法的判断,递归下降分析程序
    第十次-消除左递归
    第九次-DFA最小化,语法分析初步
    个人作业——软件工程实践总结作业
    【评分】Alpha阶段
    K 班前7次作业成绩汇总
    【评分】第七次作业--项目需求分析(团队)
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7241872.html
Copyright © 2011-2022 走看看