您好,登錄后才能下訂單哦!
這篇文章主要講解了“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怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。