算法系列之图--DFS
生活随笔
收集整理的這篇文章主要介紹了
算法系列之图--DFS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
深度優先搜索使用的策略是,只要與可能就在圖中盡量“深入”。DFS總是對最近才發現的結點v出發邊進行探索,知道該結點的所有出發邊都被發現為止。一旦v的所有出發邊都被發現了,搜索就回溯到v的前驅結點(v是經該結點才被發現的),來搜索該前驅結點的出發邊。該過程持續知道從源結點可以到達的所有結點都被發現為止。此后若還存在未被發現的結點,則DFS將從從未被發現的結點中任選一個結點作為新的源節點,并重復同樣的過程。
還是老辦法,上代碼,可以清楚地解釋:
1 #include <iostream> 2 #include <list> 3 using namespace std; 4 5 class Graph{ 6 private: 7 int v;//結點數 8 list<int>* adj;//結點臨接鏈表 9 void DFSUtil(int u,bool visited[]); 10 public: 11 Graph(int v); 12 void addEdge(int start,int end); 13 void DFS(); 14 }; 15 16 Graph::Graph(int v){ 17 this->v = v; 18 adj = new list<int>[v]; 19 } 20 21 //無向圖 22 void Graph::addEdge(int start,int end){ 23 adj[start].push_back(end); 24 adj[end].push_back(start); 25 } 26 27 void Graph::DFSUtil(int u,bool visited[]){ 28 visited[u] = true; 29 cout<<u<<" "; 30 list<int>::iterator beg = adj[u].begin(); 31 for (;beg != adj[u].end();++beg){ 32 if (visited[*beg] == false) 33 DFSUtil(*beg,visited); 34 } 35 } 36 37 void Graph::DFS(){ 38 bool* visited = new bool[v]; 39 for (int i=0;i<v;i++) 40 visited[i] = false; 41 //遞歸調用dfsutil函數深度遍歷每個結點 42 for (int i=0;i<v;i++) 43 if (visited[i] == false) 44 DFSUtil(i,visited); 45 cout<<endl; 46 } 47 48 int main() 49 { 50 Graph g = Graph(8); 51 g.addEdge(0,1); 52 g.addEdge(0,2); 53 g.addEdge(0,5); 54 g.addEdge(1,3); 55 g.addEdge(2,3); 56 g.addEdge(2,4); 57 g.addEdge(2,5); 58 g.addEdge(4,5); 59 g.addEdge(6,7); 60 g.DFS(); 61 62 return 0; 63 }需要指出的是,本例使用的是無向圖,但DFS也可以針對有向圖。
需要加以說明的是,即使該圖中有結點無法保證能到達圖中所有結點,但代碼中第42行可以保證圖中每個結點都會被訪問到。
運行結果如下:
文獻引用:算法導論->22章->基本圖算法
代碼參考:http://www.geeksforgeeks.org/depth-first-traversal-for-a-graph/
轉載于:https://www.cnblogs.com/lxiao/p/4320601.html
總結
以上是生活随笔為你收集整理的算法系列之图--DFS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 换行符
- 下一篇: Eclipse jetty和plugin