构造如图所示的的无向图:
#include<iostream>
using namespace std;
#define MaxSize 10//图中最多的顶点个数
class MGraph {
public:
MGraph(int a[], int n, int e);
void DFSTraverse(int v);//深度优先遍历
void BFSTraverse(int v);//广度优先
void clear();//清空访问标记
private:
int vertex[MaxSize];//存放顶点
int arc[MaxSize][MaxSize];//存放边数
int visited[MaxSize] = { 0 };
int Q[MaxSize];//队列,存放下标
int vertexNum, arcNum;//顶点数和边数
int front, rear;
};
// 邻接矩阵的构造函数
MGraph::MGraph(int a[], int n, int e)
{
vertexNum = n;//顶点个数
arcNum = e;// 边的条数
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;
// 依次输入每一条边
for (int k = 0;k < arcNum;k++)
{
int i, j;
cout << "输入边依附的两个顶点的编号:" << endl;
cin >> i >> j;// 输入边依附的两个顶点的编号
arc[i][j] = 1;
arc[j][i] = 1;//置有边标志
}
}
// 深度优先遍历算法
void MGraph::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);
}
// 广度优先遍历
void MGraph::BFSTraverse(int v)
{
front = rear = -1;//初始化队列
cout << vertex[v]<<" ";
visited[v] = 1;
Q[++rear] = v;//被访问的结点入队
while (front != rear)
{
v = Q[++front];
for(int j=0;j<vertexNum;j++)
if (arc[v][j] == 1 && visited[j] == 0)
{
cout << vertex[j] << " ";
visited[j] = 1;
Q[++rear] = j;
}
}
}
void MGraph::clear()
{
for (int i = 0;i < MaxSize;i++)
visited[i] = 0;
}
int main()
{
int a[MaxSize] = { 0,1,2,3,4,5 };
MGraph mgraph(a, 6 , 8);
cout << "深度优先遍历的结果为:" << endl;
mgraph.DFSTraverse(0);
cout << endl;
mgraph.clear();
cout << "广度优先遍历的结果为:" << endl;
mgraph.BFSTraverse(0);
cout << endl;
system("pause");
return 0;
}
结果: