演算法(13)DFS(深度優先遍歷)&BFS(廣度優先遍歷)——鄰接矩陣
阿新 • • 發佈:2019-01-25
在網上看到的這段程式是用鄰接矩陣做的,有時間我會在後面用鄰接連結串列嘗試一下。
程式碼來自 http://blog.csdn.net/qq_22335577/article/details/40684573
不過這程式碼寫得並不是很完美,還有優化的可能,對程式碼做了一些改動,在原思路不變的基礎上。也做了一些註釋,更方便閱讀。
#include<iostream> using namespace std; typedef char vertextype; typedef int edgetype; #define maxvex 100 #define infinity 1000 #include<queue> int visited[100]; class MGraph{ public: vertextype vexs[maxvex]; //這些資料還是用private比較好,封裝起來 edgetype arc[maxvex][maxvex]; int numvertexs,numedges;//圖的頂點數目和圖的邊的數目 MGraph(const int &v,const int &e):numvertexs(v),numedges(e){} //這個numedge完全沒有用到啊??? void creategraph();//建立圖結構 void displaygraph();//顯示圖的結構 void DFS(int i);//深度優先遍歷的子函式 void DFSTraverse(); void MGraph::BFS(i); void BFSTraverse();//定義廣度遍歷演算法 }; void MGraph::creategraph() //初始化頂點和鄰接矩陣 { cout<<"please inpit vertex type:"<<numvertexs<<endl; for(int i=0;i<numvertexs;++i) { cin>>vexs[i]; } cin.clear(); cout<<"please initiate the matrix:"<<numvertexs<<"*"<<numvertexs<<endl; for(int i=0;i<numvertexs;++i) { for(int j=0;j<numvertexs;++j) { cin>>arc[i][j]; } } } void MGraph::displaygraph() //顯示圖 { cout<<"print the vertex:"<<endl; for(int i=0;i<numvertexs;++i) { cout<<vexs[i]<<" "; } cout<<endl; for(int i=0;i<numvertexs;++i) { for(int j=0;j<numvertexs;++j) { cout<<arc[i][j]<<'\t'; } cout<<endl; } } //下面定義深度優先的函式 void MGraph::DFS(int i) //這裡的i為頂點 { int j; visited[i]=true; cout<<"DFS info:"<<vexs[i]<<endl; for(j=0;j<numvertexs;++j) { if(arc[i][j]==1&&!visited[j]) //有邊而且未被訪問過,遞迴 DFS(j); } } void MGraph::DFSTraverse() //深度遍歷 { int i; for(i=0;i<numvertexs;++i) { visited[i]=0; //初始化都未訪問 } for(i=0;i<numvertexs;++i) { if(!visited[i]) //這句是有必要的,因為可能在DFS的時候,已經訪問過了 DFS(i); } } void MGraph::BFS(i) //對一個頂點進行BFS { if(!visited[i]) //同樣這句也是有必要的,確保沒有被訪問過 { visited[i]=true; cout<<"BFS info:"<<vexs[i]<<endl; q.push(i); while(!q.empty()) //queue不為空,即遍歷沒有完成 { int k; k=q.front(); //獲取隊首元素 q.pop(); //出佇列 for(j=0;j<numvertexs;++j) { if(arc[i][j]==1&&!visited[j]) //判斷是否右邊,是否遍歷過 { visited[j]=true; cout<<"BFS info:"<<vexs[i]<<endl; q.push(j); //入隊 } } } } } void MGraph::BFSTraverse() //廣度遍歷 { int i,j; queue<int> q; //設定queue,儲存遍歷到的頂點,通過入棧出棧遍歷 for(i=0;i<numvertexs;++i) //初始化所有的都未訪問 visited[numvertexs]=0; for(i=0;i<numvertexs;++i) { BFS(i); //呼叫了上面的子函式 } } int main() { MGraph G(4,5); G.creategraph(); G.displaygraph(); G.DFSTraverse(); G.BFSTraverse(); system("pause"); return 0; }