資料結構 筆記:圖的遍歷(DFS)
阿新 • • 發佈:2018-12-01
深度優先(DFS)
深度優先演算法
-原料:class LinkStack<T>;
-步驟:
-將起始頂點壓入棧中
-彈出棧頂頂點v,判斷是否已經標記(標記:轉2,為標記:轉3)
-標記頂點v,並將頂點v的鄰接頂點壓入棧中
-判斷棧是否為空(非空:轉2,空:結束)
深度優先演算法示例
SharedPointer<Array<int>> DFS(int i) { DynamicArray<int>* ret = NULL; if((0 <= i) && (i < vCount())) { LinkStack<int> s; LinkQueue<int> r; DynamicArray<bool> visited(vCount()); for(int j =0;j<visited.length();j++) { visited[j] = false; } s.push(i); while(s.size() > 0) { int v = s.top(); s.pop(); if(!visited[v]) { SharedPointer<Array<int>> aj = getAdjacent(v); for(int j=aj->length()-1;j>=0;j--) { s.push((*aj)[j]); } r.add(v); visited[v] = true; } } ret = toArray(r); } else { //丟擲異常 } return ret; }
遞迴版深度優先
-定義功能:DFS(graph,vex)
·以頂點vex為起始頂點深度優先遍歷graph
template<typename V,typename E> void DFS(Graph<V,E>& g,int v,Array<bool>& visited) { if((0 <= v) && (v < g.vCount())) { cout << v<< endl; visited[v] = true; SharedPointer<Array <int>> aj = g.getAdjacent(v); for(int i = 0;i<aj->length();i++) { if(!visited[(*aj)[i]]) { DFS(g,(*aj)[i],visited); } } } else { //丟擲異常 } } template<typename V,typename E> void DFS(Graph<V,E>& g,int v) { DynamicArray<bool> visited(g.vCount()); for(int i = 0;i<visited.length();i++) { visited[i] = false; } DFS(g,v,visited); }
總結:
-深度優先按照“先序遍歷的方式”對頂點進行訪問
-深度優先演算法的核心是棧的使用
-深度優先和廣度優先的唯一不同在於棧佇列的使用
-深度優先演算法可以使用遞迴的方式實現