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; //至此,當前頂點訪問完畢
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章