上篇深度优先遍历(DFS)的时候,在二维矩阵中,把标识放在了side上,在上面还感觉没有啥子影响,但由于广度遍历的时候,标记的设置要放在push到queue中的时候,就比较难受,所以最好还是把访问标识放在vertex中。广度优先遍历(BFS)借助stl deque实现,借用上篇的代码修改实现,还是采用二维矩阵和邻接表实现
#include<iostream> #include<deque> #define MAX_VERTEX 100 using namespace std; deque<int> _deque; //array struct Side_Array{ int link; }; struct Vertex_array{ int mark; char data; }; Vertex_array vertex_infos[MAX_VERTEX]; Side_Array matrix[MAX_VERTEX][MAX_VERTEX]; void BFS_For_Array(int x){ if(vertex_infos[x].data==0){ return; } cout<<vertex_infos[x].data; for(int i=0;i<MAX_VERTEX;i++){ if(matrix[x][i].link==1&&vertex_infos[i].mark==0){ _deque.push_back(i); vertex_infos[i].mark=1; } } while(!_deque.empty()){ int index=_deque.front(); _deque.pop_front(); BFS_For_Array(index); } } int Array_Check(){ for(int i=0;i<MAX_VERTEX;i++){ if(vertex_infos[i].mark==0&&vertex_infos[i].data!=0){ return i; } } return -1; } //list struct Side{ int index; int weight; Side* next; }; struct Vertex{ char data; int mark; Side* first; }; typedef Vertex AdjList[MAX_VERTEX]; struct AdjGraph { AdjList adjlist; int num_vertex; int num_side; }; void BFS_For_List(AdjGraph& adjGraph,int x){ if(adjGraph.adjlist[x].data==0){ return; } cout<<adjGraph.adjlist[x].data; Side* p=adjGraph.adjlist[x].first; while(p!=0){ if(adjGraph.adjlist[p->index].mark==0){ _deque.push_back(p->index); adjGraph.adjlist[p->index].mark=1; } p=p->next; } while(!_deque.empty()){ int index=_deque.front(); _deque.pop_front(); BFS_For_List(adjGraph,index); } } int List_Check(AdjGraph& adjGraph){ for(int i=0;i<MAX_VERTEX;i++){ if(adjGraph.adjlist[i].mark==0&&adjGraph.adjlist[i].data!=0){ return i; } } return -1; } int main(){ //array /* for(int i=0;i<MAX_VERTEX;i++){ vertex_infos[i].data=0; vertex_infos[i].mark=0; for(int j=0;j<MAX_VERTEX;j++){ matrix[i][j].link=0; } } cout<<"input vertex and side nums:"; int num_vertex; int num_side; cin>>num_vertex>>num_side; cout<<"input vertex char data:"; for(int i=0;i<num_vertex;i++){ cin>>vertex_infos[i].data; } for(int i=0;i<num_side;i++){ int v1; int v2; cout<<"input two vertex:"; cin>>v1>>v2; matrix[v1][v2].link=1; matrix[v2][v1].link=1; } int index=Array_Check(); vertex_infos[0].mark=1; while(index!=-1){ BFS_For_Array(index); index=Array_Check(); } cout<<endl;*/ //list AdjGraph adjGraph; for(int i=0;i<MAX_VERTEX;i++){ adjGraph.adjlist[i].mark=0; adjGraph.adjlist[i].data=0; adjGraph.adjlist[i].first=0; } cout<<"input vertex and side nums:"; cin>>adjGraph.num_vertex>>adjGraph.num_side; cout<<"input vertex char data:"; for(int i=0;i<adjGraph.num_vertex;i++){ cin>>adjGraph.adjlist[i].data; } for(int i=0;i<adjGraph.num_side;i++){ int v1; int v2; cout<<"input two vertex:"; cin>>v1>>v2; Side* side1=new Side(); side1->index=v2; Side* side2=new Side(); side2->index=v1; if(adjGraph.adjlist[v1].first==0){ adjGraph.adjlist[v1].first=side1; } else{ Side* temp=adjGraph.adjlist[v1].first; adjGraph.adjlist[v1].first=side1; side1->next=temp; } if(adjGraph.adjlist[v2].first==0){ adjGraph.adjlist[v2].first=side2; } else{ Side* temp=adjGraph.adjlist[v2].first; adjGraph.adjlist[v2].first=side2; side2->next=temp; } } int index=List_Check(adjGraph); adjGraph.adjlist[0].mark=1; while(index!=-1){ BFS_For_List(adjGraph,index); index=List_Check(adjGraph); } cout<<endl; for(int i=0;i<adjGraph.num_vertex;i++){ Side* p=adjGraph.adjlist[i].first; while(p!=0){ Side* temp=p->next; delete p; p=temp; } } return 0; }
