溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++的DFS和BFS怎么實現(xiàn)

發(fā)布時間:2021-11-30 16:00:47 來源:億速云 閱讀:167 作者:iii 欄目:編程語言

這篇文章主要講解了“C++的DFS和BFS怎么實現(xiàn)”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++的DFS和BFS怎么實現(xiàn)”吧!

DFS和BFS

對于非線性的結構,遍歷都會首先成為一個問題。和二叉樹的遍歷一樣,圖也有深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)兩種。不同的是,圖中每個頂點沒有了祖先和子孫的關系,因此,前序、中序、后序不再有意義了。仿照二叉樹的遍歷,很容易就能完成DFS和BFS,只是要注意圖中可能有回路,因此,必須對訪問過的頂點做標記。

最基本的有向帶權網

#ifndef Graph_H   #define Graph_H    #include    #include    using namespace std;   #include "Graphmem.h"    template <class name, class dist, class mem>   class Network   {   public:   Network() {}   Network(dist maxdist) { data.NoEdge = maxdist; }   ~Network() {}   bool insertV(name v) { return data.insertV(v); }   bool insertE(name v1, name v2, dist cost) { return data.insertE(v1, v2, cost); }   name& getV(int n) { return data.getV(n); }   int nextV(int m, int n = -1) { return data.nextV(m, n); }   int vNum() { return data.vNum; }   int eNum() { return data.eNum; }   protected:   bool* visited;   static void print(name v) { cout << v; }   private:   mem data;   };   #endif

你可以看到,這是在以mem方式儲存的data上面加了一層外殼。在圖這里,邏輯上分有向、無向,帶權、不帶權;儲存結構上有鄰接矩陣和鄰接表。也就是說分開來有8個類。為了***限度的復用代碼,繼承關系就非常復雜了。但是,多重繼承是件很討厭的事,什么覆蓋啊,還有什么虛擬繼承,我可不想花大量篇幅講語言特性。于是,我將儲存方式作為第三個模板參數(shù),這樣一來就省得涉及虛擬繼承了,只是這樣一來這個Network的實例化就很麻煩了,不過這可以通過typedef或者外殼類來解決,我就不寫了。反正只是為了讓大家明白,真正要用的時候,***是寫專門的類,比如無向無權鄰接矩陣圖,不要搞的繼承關系亂七八糟。

DFS和BFS的實現(xiàn)

public:   void DFS(void(*visit)(name v) = print)   {   visited = new bool[vNum()];   for (int i = 0; i < vNum(); i++) visited[i] = false;   DFS(0, visit);   delete []visited;   }   protected:   void DFS(int i, void(*visit)(name v) = print)   {   visit(getV(i)); visited[i] = true;   for (int n = nextV(i); n != -1; n = nextV(i, n))   if (!visited[n]) DFS(n, visit);   }   public:   void BFS(int i = 0, void(*visit)(name v) = print)//n沒有越界檢查   {   visited = new bool[vNum()]; queue<int> a; int n;   for (n = 0; n < vNum(); n++) visited[n] = false;   visited[i] = true;   while (i != -1)//這個判斷可能是無用的   {   visit(getV(i));   for (n = nextV(i); n != -1; n = nextV(i, n))   if (!visited[n]) { a.push(n); visited[n] = true; }   if (a.empty()) break;   i = a.front(); a.pop();   }   delete []visited;   }

DFS和BFS函數(shù)很難寫得像樹的遍歷方法那么通用,這在后面就會看到,雖然我們使用了DFS和BFS的思想,但是上面的函數(shù)卻不能直接使用。因為樹的信息主要在節(jié)點上,而圖的邊上還有信息。

測試程序

#include    using namespace std;   #include "Graph.h"   int main()   {   Network<char, int, LinkedList<char, int> > a;   a.insertV('A'); a.insertV('B');   a.insertV('C'); a.insertV('D');   a.insertE('A', 'B', 1); a.insertE('A', 'C', 2);   a.insertE('B', 'D', 3);   cout << "DFS: "; a.DFS(); cout << endl;   cout << "BFS: "; a.BFS(); cout << endl;   return 0;   }

感謝各位的閱讀,以上就是“C++的DFS和BFS怎么實現(xiàn)”的內容了,經過本文的學習后,相信大家對C++的DFS和BFS怎么實現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI