关于C++图的遍历(代码)
程序员文章站
2022-06-17 19:21:40
关于c++图的遍历(代码)
#include
#include
#include
#inclu...
关于c++图的遍历(代码)
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<cstring> const int maxsize=100; const int vertexnum=20; typedef struct{ int *qbase; int front,rear; }sqqueue; void initqueue(sqqueue &q){ q.qbase = (int *)malloc(sizeof(int) *vertexnum); if(!q.qbase) return ; q.rear = q.front = -1; } void enqueue(sqqueue &q, int i){ q.qbase[q.rear ++] = i; } void dequeue(sqqueue &q, int &i){ i = q.qbase[q.front ++]; } int queueempty(sqqueue q){ if(q.front == q.rear) return 1; return 0; } template<class t> class mgraph { public: mgraph(t a[],int n,int e); ~mgraph(){} void dfstraverse(); void bfstraverse(int v); void deeptra(int v[],int n); private: t vertex[maxsize]; //节点数组 int arc[maxsize][maxsize]; //矩阵 int vertexnum,arcnum; //节点数与边数 int visited[maxsize]; //访问记录 }; template<class t> mgraph<t>::mgraph(t a[],int n,int e) { int i,j; vertexnum=n; arcnum=e; for(i=0;i<vertexnum;i++) { vertex[i]=a[i]; } for(i=0;i<vertexnum;i++) for(j=0;j<vertexnum;j++) { arc[i][j]=0; } for(int k=0;k<arcnum;k++) { std::cout<<"输入第"<<k+1<<"条边:"<<std::endl; std::cin>>i>>j; arc[i][j]=1; arc[j][i]=1; } } template<class t> void mgraph<t>::dfstraverse() { int i; for(i=0;i<vertexnum;i++) { visited[i]=0; } std::cout<<"深度优先遍历:"<<std::endl; for(i=0;i<vertexnum;i++) { if(visited[i]==0) deeptra(visited,0); } } template<class t> void mgraph<t>::deeptra(int v[],int n) { int i; visited[n]=1; std::cout<<vertex[n]; for(i=0;i<vertexnum;i++) { if(arc[n][i]!=0&&visited[i]==0) { deeptra(visited,i); } } } template<class t> void mgraph<t>::bfstraverse(int v) { sqqueue q; q.front=q.rear=-1; int i; for(i=0;i<vertexnum;i++) { visited[i]=0; } std::cout<<std::endl; std::cout<<"广度优先遍历:"<<std::endl; std::cout<<vertex[v]; visited[v]=1; initqueue(q); enqueue(q,v); while(!queueempty(q)) { dequeue(q,v); for(int i=0;i<vertexnum;i++) if(arc[v][i]==1&&visited[i]==0) { std::cout<<vertex[i]; visited[i]=1; enqueue(q,i); } } } int main() { int e,n; std::cout<<"点的个数:"<<" "; std::cin>>e; std::cout<<"边的个数:"<<" "; std::cin>>n; char s[e]; for(int i=0;i<e;i++) { std::cout<<"输入第"<<i+1<<"个点:"; std::cin>>s[i]; } mgraph<char> m(s,e,n); m.dfstraverse(); m.bfstraverse(0); return 0; }
下一篇: java基础知识点(一)