99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

C++的DFS和BFS怎么實現

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

創新互聯公司專注于山城網站建設服務及定制,我們擁有豐富的企業做網站經驗。 熱誠為您提供山城營銷型網站建設,山城網站制作、山城網頁設計、山城網站官網定制、成都小程序開發服務,打造山城網絡公司原創品牌,更為您提供山城網站排名全網營銷落地服務。

DFS和BFS

對于非線性的結構,遍歷都會首先成為一個問題。和二叉樹的遍歷一樣,圖也有深度優先搜索(DFS)和廣度優先搜索(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個類。為了***限度的復用代碼,繼承關系就非常復雜了。但是,多重繼承是件很討厭的事,什么覆蓋啊,還有什么虛擬繼承,我可不想花大量篇幅講語言特性。于是,我將儲存方式作為第三個模板參數,這樣一來就省得涉及虛擬繼承了,只是這樣一來這個Network的實例化就很麻煩了,不過這可以通過typedef或者外殼類來解決,我就不寫了。反正只是為了讓大家明白,真正要用的時候,***是寫專門的類,比如無向無權鄰接矩陣圖,不要搞的繼承關系亂七八糟。

DFS和BFS的實現

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

測試程序

#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怎么實現”的內容了,經過本文的學習后,相信大家對C++的DFS和BFS怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創新互聯,小編將為大家推送更多相關知識點的文章,歡迎關注!

網站題目:C++的DFS和BFS怎么實現
文章URL:http://www.yijiale78.com/article30/jcecso.html

成都網站建設公司_創新互聯,為您提供虛擬主機網站導航品牌網站建設網頁設計公司網站收錄外貿建站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設