重点:
1、深度优先遍历——递归
2、广度优先遍历——队列
#include<bits/stdc++.h>
using namespace std;
const int MaxSize=10;//图中最多顶点的个数
int visited[MaxSize];
template<class DataType>
class Queue
{
public:
DataType data[MaxSize];
int front,rear;
};
template<class DataType>
class MGraph
{
private:
DataType vertex[MaxSize];//存放图中顶点的数组
int arc[MaxSize][MaxSize];//存放图中边的数组
int vertexNum,arcNum;//图的顶点数和边数
public:
MGraph(DataType a[],int vn,int an);//构造函数
~MGraph(){}
void DFSTraverse(int v);//深度优先遍历
void BFSTraverse(int v);//广度优先遍历
};
//构造一个图
template<class DataType>
MGraph<DataType>::MGraph(DataType a[],int vn,int an)
{
vertexNum=vn;
arcNum=an;
for(int i=0;i<vertexNum;i++)
{
vertex[i]=a[i];//输入的数据为图的结点的编号
}
for(int i=0;i<vertexNum;i++)//初始化邻接矩阵
{
for(int j=0;j<vertexNum;j++)
{
arc[i][j]=0;//初始化邻接矩阵的边都是0
}
}
for(int k=0;k<arcNum;k++)//依次输入每一条边
{
cout<<"输入该边依附的两个顶点:"<<endl;
int i,j;
cin>>i>>j;//输入边依附的两个顶点的编号
arc[i][j]=1;//有边为1
arc[j][i]=1;//无向图是对称矩阵
}
}
//深度优先遍历
template<class DataType>
void MGraph<DataType>::DFSTraverse(int v)
{
cout<<"开始访问的顶点:"<<vertex[v]<<endl;
visited[v]=1;
for(int j=0;j<vertexNum;j++)
{
if(arc[v][j]==1&&visited[j]==0)
{
DFSTraverse(j);
}
}
}
//广度优先遍历
template<class DataType>
void MGraph<DataType>::BFSTraverse(int v)
{
Queue<int> Q;//定义一个队列,队列类的对象
Q.front=Q.rear=-1;//假设采用顺序队列且不会发生溢出
cout<<"开始访问的结点:"<<vertex[v]<<" ";
visited[v]=1;
Q.data[++Q.rear]=v;//结点v入队
while (Q.front!=Q.rear)
{
v=Q.data[++Q.front];//将队头元素出队,并保存至V中
for (int j=0; j<vertexNum; j++){
if (arc[v][j]==1 && visited[j]==0 ) {
cout<<vertex[j]<<" ";
visited[j]=1;
Q.data[++Q.rear]=j;
}
}
}
}
int main()
{
int a[5]={0,1,2,3,4};
MGraph <int> graph(a,5,4);
for(int i=0;i<MaxSize;i++)
{
visited[i]=0;
}
graph.DFSTraverse(0);//从节点0开始深度优先遍历
cout<<endl;
for(int i=0;i<MaxSize;i++)
{
visited[i]=0;
}
graph.BFSTraverse(0);//从0结点开始广度优先遍历
cout<<endl;
return 0;
}
输出: