有向圖和無向圖鄰接矩陣的輸入輸出,深度深度優先搜尋,廣度優先搜尋
阿新 • • 發佈:2019-01-31
#include<iostream> #include<stdlib.h> #include<malloc.h> #include<queue> #define MAXLEN 100 using namespace std; typedef char DataType; bool visited[MAXLEN]; typedef struct{ DataType vex[MAXLEN]; //頂點表 int arcs[MAXLEN][MAXLEN]; //鄰接矩陣,可以看作表 int NumVertexes,NumEdges; //圖中當前的頂點數和邊數 }Graph; void CreateGraph(Graph *&G) { G=(Graph*)malloc(sizeof(Graph)); //為結構體物件建立空間 int i,j,k; cout<<"圖的頂點數為:"<<endl; cin>>G->NumVertexes; cout<<"圖的邊數為:"<<endl; cin>>G->NumEdges; cout<<"輸入頂點資訊:"<<endl; for(i=1;i<=G->NumVertexes;i++) cin>>G->vex[i]; //讀入頂點資訊 for(i=1;i<=G->NumVertexes;i++) for(j=1;j<=G->NumVertexes;j++) G->arcs[i][j]=0; //鄰接矩陣初始化 /*for(i=1;i<=G->NumVertexes;i++) for(j=1;j<=G->NumVertexes;j++) G->arcs[i][j]=-1; */ //有權值的鄰接矩陣初始化 for(k=1;k<=G->NumEdges;k++) //讀入e條邊 這時為無向圖 { cout<<"讀入邊:"<<endl; cin>>i>>j; G->arcs[i][j]=1; G->arcs[j][i]=1; /* cout<<"讀入邊和權值:"<<endl; //當為有權值的圖時 int w; cin>>i>>j>>w; G->arcs[i][j]=w; G->arcs[j][i]=w; */ } /* for(k=1;k<=G->NumEdge;k++) //讀入e條邊 這時為有向圖 { cout<<"讀入邊:"<<endl; cin>>i>>j; G->arcs[i][j]=1; // cout<<"讀入邊和權值:"<<endl; //當為有權值的圖時 // int w; // cin>>i>>j>>w; // G->arcs[i][j]=w; }*/ } void PrintGraph(Graph *G) { cout<<"圖的鄰接矩陣為:"<<endl; for(int i=1;i<=G->NumVertexes;i++) { for(int j=1;j<=G->NumVertexes;j++) cout<<G->arcs[i][j]<<" "; cout<<endl; } } //深度優先遍歷(鄰接矩陣) void DFS(Graph *G,int i) { visited[i]=true; cout<<G->vex[i]; for(int j=1;j<=G->NumVertexes;j++) if(G->arcs[i][j]==1&&!visited[j]) DFS(G,j); } //鄰接矩陣的深度優先遍歷操作 void DFSTraverse(Graph *G) { cout<<"鄰接矩陣的深度優先遍歷結果為:"<<endl; for(int i=1;i<=G->NumVertexes;i++) visited[i]=false; //初始化所有的頂點狀態都是未訪問的狀態 for(int i=1;i<=G->NumVertexes;i++) if(!visited[i]) //對未訪問過的頂點呼叫DFS,若是連通圖,只會執行一次 DFS(G,i); cout<<endl; } //鄰接矩陣的廣度優先遍歷 void BFSTraverse(Graph *G) { cout<<"鄰接矩陣的廣度優先遍歷結果為:"<<endl; queue<int> q; //定義一個佇列q for(int i=1;i<=G->NumVertexes;i++) visited[i]=false; for(int i=1;i<=G->NumVertexes;i++) { if(!visited[i]) { visited[i]=true; cout<<G->vex[i]; q.push(i); while(!q.empty()) { int t; t=q.front(); q.pop(); for(int j=1;j<=G->NumVertexes;j++) { if(G->arcs[t][j]==1&&!visited[j]) { visited[j]=true; cout<<G->vex[j]; q.push(j); } } } } } cout<<endl; } int main() { Graph *G; CreateGraph(G); PrintGraph(G); DFSTraverse(G); BFSTraverse(G); }