图的遍历 C++

来源:互联网 发布:数据采集器厂家 编辑:程序博客网 时间:2024/06/16 20:11
#include <iostream>#include <queue>using namespace std;const int MaxSize = 5;template <class T>class MGraph{public:MGraph(T a[], int b[][MaxSize],int n,int e);//构造函数,建立具有n个顶点e条边的图void dfsTraverse(int v);//深度优先遍历图void bfsTraverse(int v);//广度优先遍历图private:T vertex[MaxSize];//存放图中顶点的数组int arc[MaxSize][MaxSize];//存放图中边的数组int vertexNum, arcNum;//图的顶点数和边数int visited[MaxSize];//有没访问数组queue<int> que;};template <class T>MGraph<T>::MGraph(T a[], int b[][MaxSize],int n,int e){vertexNum = n;arcNum = e;for(int i=0;i<vertexNum;i++){vertex[i] = a[i];visited[i]=0;}for(int i=0;i<vertexNum;i++)//直接放入邻接矩阵for(int j=0;j<vertexNum;j++)arc[i][j]=b[i][j];}template <class T>void MGraph<T>::dfsTraverse(int v)//深度优先{cout<<vertex[v]<<" ";//访问一次,标记已被访问过visited[v]=1;for(int j=0;j<vertexNum;j++)if(arc[v][j]==1 && visited[j]==0)//存在此边,且没被访问过dfsTraverse(j);}template <class T>void MGraph<T>::bfsTraverse(int v)//广度优先{for(int i=0;i<vertexNum;i++){visited[i]=0;}cout<<vertex[v]<<" ";//访问一次,标记已被访问过visited[v]=1;que.push(v);//被访问顶点入队while(que.empty()!=1){v = que.front();//队头元素出队放入v中que.pop();for(int j=0;j<vertexNum;j++)if(arc[v][j]==1 && visited[j]==0)//判断是否有边,且顶点有没有别访问过{cout<<vertex[j]<<" ";visited[j]=1;que.push(j);}}}void main(){char a[5] = {'A','B','C','D','E'};//邻接矩阵int b[5][5] = {0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,0,0,0,1,1,0,0,};MGraph<char> GM(a,b,5,6);cout<<"广度优先遍历:"<<endl;GM.dfsTraverse(0);//从A开始访问cout<<endl;cout<<"深度优先遍历:"<<endl;GM.bfsTraverse(0);//从A开始访问cout<<endl;}

0 0