C++實現圖的鄰接矩陣的建立以及其深度優先遍歷和廣度優先遍歷
阿新 • • 發佈:2019-01-06
#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]; edgetype arc[maxvex][maxvex]; int numvertexs,numedges;//圖的頂點數目和圖的邊的數目 MGraph(const int &v,const int &e):numvertexs(v),numedges(e){} void creategraph();//建立圖結構 void displaygraph();//顯示圖的結構 void DFS(int i);//深度優先遍歷的子函式 void DFSTraverse(); void BFSTraverse();//定義廣度遍歷演算法 }; void MGraph::creategraph() { cout<<"下面請輸入頂點的元素型別值,輸入的個數為"<<numvertexs<<endl; for(int i=0;i<numvertexs;++i) { cin>>vexs[i]; } cin.clear(); cout<<"下面請為鄰接矩陣賦值,矩陣的大小為:"<<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<<"下面輸出的是頂點中的元素"<<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) { int j; visited[i]=true; cout<<"深度優先輸出的結點資訊"<<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(i); } } void MGraph::BFSTraverse() { int i,j; queue<int> q; for(i=0;i<numvertexs;++i) visited[numvertexs]=0; for(i=0;i<numvertexs;++i) { if(!visited[i]) { visited[i]=1; cout<<"廣度遍歷的結點的資訊為"<<vexs[i]<<endl; q.push(i); while(!q.empty()) { int k; k=q.front(); q.pop(); for(j=0;j<numvertexs;++j) { if(arc[i][j]==1&&!visited[j]) { visited[j]=1; cout<<"廣度遍歷的結點的資訊為"<<vexs[i]<<endl; q.push(j); } } } } } } int main() { MGraph G(4,5); G.creategraph(); G.displaygraph(); //G.DFSTraverse(); G.BFSTraverse(); system("pause"); return 0; }