一、实现功能:
1、通过邻接矩阵完成图的创建。
2、完成深度优先和广度优先遍历。
二、示意图
(1)需要程序实现的无向图如下:
(2)邻接矩阵和顶点表的图示:
三、程序代码:
1、输入样例:(有关系的结点下标)
0 1
0 2
1 3
1 4
4 2
2 0
2、输出样例:
3、程序代码:
#include<iostream>
#define MAXSIZE 100
using namespace std;
int visited[MAXSIZE] = { 0 };//全局变量数组初始化,用来标记访问完的顶点
class MGraph
{
public:
MGraph(char a[], int n, int e);//有参构造函数
~MGraph();
public:
void DFtraverse(int v);//深度遍历
void BFtraverse(int v);//广度遍历
private:
char vertex[MAXSIZE];//顶点表
int edge[MAXSIZE][MAXSIZE];//边表
int VertexNum, EdgeNum;//顶点数,边数
};
//构造函数
MGraph::MGraph(char a[], int n, int e)
{
int i, j, k;//i,j:顶点下标,k:边数
VertexNum = n;
EdgeNum = e;
for (i = 0; i < VertexNum; i++)//存入顶点信息
vertex[i] = a[i];
for (i = 0; i < VertexNum; i++)//初始化邻接矩阵
for (j = 0; j < VertexNum; j++)
edge[i][j] = 0;
for (k = 0; k < EdgeNum; k++)//输入顶点的边
{
cin >> i >> j;//输入关系边(相连的顶点下标)
edge[i][j] = 1;//有关系的置为1
edge[j][i] = 1;//因为此图是无向图,所以邻接矩阵是对称矩阵
}
}
//析构函数
MGraph::~MGraph()
{
//静态存储分配
//自动释放存储空间
//析构函数为空
}
//深度优先遍历(栈结构-递归)
void MGraph::DFtraverse(int v)
{
cout << vertex[v]<<'\t';
visited[v] = 1;
for (int j = 0; j < VertexNum; j++)
{
if (edge[v][j] == 1 && visited[j] == 0)//遍历邻接矩阵,如果发现两顶点有关系并且这个顶点未被访问
DFtraverse(j);//就递归,访问这个顶点(在下次递归的函数中输出这个顶点值,并标记以访问)
}
}
//广度优先遍历(队列结构)
void MGraph::BFtraverse(int v)
{
for (int i = 0; i < 5; i++)//初始顶点都未被访问,标记为0-------------------------在主函数中程序执行遵循自上而下的顺序规则,所以在实现深度遍历后visited[i]已经全被标记,所以想要接着执行广度遍历,再次函数中要访问数组重新初始化
visited[i] = 0; //也可以通过在主函数中添加判断或者开关语句实现遍历功能
int w, j, Q[MAXSIZE];//创建顺序队列(w出队暂存 j 迭代器)
int front = -1; int rear = -1;//队列初始化
cout << vertex[v]<<"\t"; visited[v] = 1;//访问并标记此节点已经访问完了
Q[++rear] = v;//被访问的顶点入队
while (front != rear)//队列存在
{
w = Q[++front];//出队
for (j = 0; j < VertexNum; j++)
if (edge[w][j] == 1 && visited[j] == 0)//遍历队列,如果边存在关系,并且未被访问
{
cout << vertex[j]<<"\t";//访问该顶点
visited[j] = 1;//标记已访问
Q[++rear] = j;//入队
}
}
}
int main()
{
int i;
char ch[] = { 'A','B','C','D','E' };
MGraph MG{ ch,5,6 };//在构造函数中传入初始默认参数{5个顶点6个边}
for (i = 0; i < 5; i++)//初始顶点都未被访问,标记为0
visited[i] = 0;
cout << endl<<"深度优先遍历是:" << endl;
MG.DFtraverse(0);//从顶点0出发
cout << endl<<"广度优先遍历是:" << endl;
MG.BFtraverse(0);
return 0;
}