圖的遍歷(鄰接矩陣的非遞迴實現)
阿新 • • 發佈:2019-02-19
#include<iostream> #include<cstring> #include<queue> using namespace std; typedef char TypeData; #define MAXVEX 100 #define INFINITY 65535 int visited[MAXVEX]={0}; int stack[MAXVEX]; queue<int> q; typedef struct stGraph { TypeData vexs[MAXVEX];//存放圖中頂點的陣列 int arc[MAXVEX][MAXVEX];//鄰接矩陣 int VNum,ENum;//頂點數、邊數 }MGraph; void CreatMGraph(MGraph *G); void DFSTraverse(MGraph *G); void BFSTraverse(MGraph *G); void CreatMGraph(MGraph *G) { int i=0,j=0,k=0,w=0; cout<<"請輸入頂點數和邊數:"<<endl; cin>>G->VNum>>G->ENum; cout<<"請輸入圖的頂點:"; for(i=0;i<G->VNum;i++) { cin>>G->vexs[i]; } for(i=0;i<G->VNum;i++) for(j=0;j<G->VNum;j++) { G->arc[i][j]=INFINITY; } for(k=0;k<G->ENum;k++) { cout<<"請輸入(vi,vj)上的下標,i,j,和權值w:"<<endl; cin>>i>>j>>w; G->arc[i][j]=w; G->arc[j][i]=w; } } void DFSTraverse(MGraph *G,int v) { int top=-1; int j; cout<<G->vexs[v]<<" "; visited[v]=1; stack[++top]=v; while(top!=-1) { v=stack[top]; for(j=0;j<G->VNum;j++) if(G->arc[v][j]!=INFINITY&&visited[j]==0){ cout<<G->vexs[j]<<" "; visited[j]=1; stack[++top]=j; break; } if(j==G->VNum) top--; } } void BFSTraverse(MGraph *G) { int i,j; for(i=0;i<G->VNum;i++) visited[i]=0; queue<int> q; for(i=0;i<G->VNum;i++) { if(visited[i]==0) { cout<<G->vexs[i]<<" "; visited[i]=1; q.push(i); while(!q.empty()) { i=q.front(); q.pop(); for(j=0;j<G->VNum;j++) if(G->arc[i][j]!=INFINITY&&visited[j]==0){ cout<<G->vexs[j]<<" "; visited[j]=1; j=q.front(); } } } } } int main() { MGraph *G=new MGraph; int v; CreatMGraph(G); cout<<"請輸入要作為源點的頂點的下標值:"<<endl; cin>>v; cout<<"該圖的深度優先遍歷順序為:"<<endl; DFSTraverse(G,v); cout<<endl; cout<<"該圖的廣度優先遍歷順序為:"<<endl; BFSTraverse(G); return 0; }