#include <iostream> #include <queue> using namespace std; const int MaxNum=100; bool flag[MaxNum]={false}; struct Graph { int VertexNum; //顶点数 int SideNum; //边数 char vexs[MaxNum]; //顶点表 int AdjacentMatrix[MaxNum][MaxNum]; //邻接矩阵 }; void CreateGraph(Graph *G) { int i,j; int a,b; cout<<"Please input the number of vertex and side:"; cin>>G->VertexNum>>G->SideNum; cout<<"Please the information of vertexs:"; for (i=0;i<G->VertexNum;++i) { cin>>G->vexs[i]; } for (i=0;i<G->VertexNum;++i) { for (j=0;j<G->VertexNum;++j) { G->AdjacentMatrix[i][j]=0; } } cout<<"Please input each two vertexs of each side:"<<endl; for (i=0;i<G->SideNum;++i) { cout<<"Input two vertexs(the number must in 0~"<<G->VertexNum-1<<")" <<"of the "<<i+1<<" side:"; cin>>a>>b; G->AdjacentMatrix[a][b]=1; G->AdjacentMatrix[b][a]=1; } } /******************************************************/ /* 深度优先遍历(深度优先搜索) /******************************************************/ void DFSM(Graph *G,int i) { cout<<"DFS Visit the vertex:"<<G->vexs[i]<<endl; flag[i]=true; for (int j=0;j<G->VertexNum;++j) { if (G->AdjacentMatrix[i][j]==1 && !flag[j]) { DFSM(G,j); } } } void DFSTraver(Graph *G) { for (int i=0;i<G->VertexNum;++i) { flag[i]=false; } for ( i=0;i<G->VertexNum;++i) { if (!flag[i]) { DFSM(G,i); } } } /******************************************************/ /* 广度优先遍历(广度优先搜索) /******************************************************/ void BFSM(Graph *G,int m) { cout<<"BFS Visit the vertex:"<<G->vexs[m]<<endl; flag[m]=true; queue<int> GQueue; GQueue.push(m); int i; while (GQueue.size()!=0) { i=GQueue.front(); GQueue.pop(); for (int j=0;j<G->VertexNum;++j) { if (G->AdjacentMatrix[i][j]==1 && !flag[j]) { cout<<"BFS Visit the vertex:"<<G->vexs[j]<<endl; flag[j]=true; GQueue.push(j); } } } } void BFSTraver(Graph *G) { for (int i=0;i<G->VertexNum;++i) { flag[i]=false; } for (i=0;i<G->VertexNum;i++) { if (!flag[i]) { BFSM(G,i); } } } int main() { Graph *G=new Graph; CreateGraph(G); DFSTraver(G); cout<<"----------------"<<endl; BFSTraver(G); delete G; return 0; }