一、实验目的
1、 熟练理解图的相关概念;
2、 掌握图的邻接矩阵的存储方法的实现;
3、 学会图的遍历算法
二、实验内容
1、自己确定一个简单无向图(顶点数、和相关结点信息)利用邻接矩阵来实现存储。实现图的构造,并完成:
1) 用深度优先和广度优秀两种算法对图进行遍历,输出顶点序列数据;
2) 以合理的格式,输出各个顶点的邻接点;
三、设计与编码
1.本实验用到的理论知识
(1)用一维数组存储图中顶点信息,二维数组存储图中边的信息(即顶点之间的邻接关系);
(2)如果i与j有关系,则在邻接矩阵中a[i][j]=1,否则a[i][j]=0;
(3)邻接矩阵中对角线的值为0,且数据关于对角线对称。
2.算法与设计
(1)定义 MGraph类模板
class MGraph
{
public:
MGraph(char a[],int n,int e); //构造函数,建立具有n个个顶点e条边的图
~MGraph(){} //析构函数为空
void DFSTraverse(int v); //深度优先遍历图
void BFSTraverse(int v); //广度优先遍历
void Print(char a [],int v,int length); //输出各顶点的邻接点
private:
char vertex[MaxSize]; //存放图中顶点的数组
int arc[MaxSize][MaxSize]; //存放图中边的数组
int vertexNum,arcNum; //图的顶点数和边数
};
3.代码#include<iostream.h>
const int MaxSize=10; //图中最多定点个数
int visited[MaxSize]={0}; //全局变量visited9初始化
class MGraph
{
public:
MGraph(char a[],int n,int e); //构造函数,建立具有n个个顶点e条边的图
~MGraph(){} //析构函数为空
void DFSTraverse(int v); //深度优先遍历图
void BFSTraverse(int v); //广度优先遍历
void Print(char a [],int v,int length); //输出各顶点的邻接点
private:
char vertex[MaxSize]; //存放图中顶点的数组
int arc[MaxSize][MaxSize]; //存放图中边的数组
int vertexNum,arcNum; //图的顶点数和边数
};
MGraph::MGraph(char a[],int n,int e)
{
int i,j,k;
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(k=0;k<arcNum;k++) //存放图的边信息
{
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) //广度优先遍历图
{
int Q[MaxSize]; //假设队列采用顺序存储且不会发生溢出
int front=-1,rear=-1; //初始化队列
//被访问的顶点入队
cout<<vertex[v];
visited[v]=1;
Q[++rear]=v;
while(front!=rear)
{
v=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[++rear]=j;
}
}
}
void MGraph::Print(char a[],int v,int length) //输出各顶点的邻接点
{
for(int i=0;i<length;i++)
{
cout<<a[i]<<"顶点的邻接点为:";
for(int j=0;j<length;j++)
{
if(arc[i][j]==1) //邻接矩阵的值为1表示有两点之间有关联
cout<<a[j]; //输出有关联的顶点
}
cout<<endl;
}
}
int main()
{
char ch[]={'A','B','C','D','E'}; //char类型的顶点信息
MGraph MG(ch,5,6);
for(int i=0;i<MaxSize;i++) //初始化图中所有顶点均未被访问
visited[i]=0;
cout<<"深度优先遍历序列是:";
MG.DFSTraverse(0); //从顶点0出发深度优先遍历图
cout<<endl;
for(i=0;i<MaxSize;i++) //初始化图中所有顶点均未被访问
visited[i]=0;
cout<<"广度优先遍历序列是:"; //从顶点0出发广度优先遍历图
MG.BFSTraverse(0);
cout<<endl;
MG.Print(ch,0,5); //邻接矩阵从顶点0出发查看顶点i与j之间的关系
cout<<endl;
return 0;
}
四、运算结果
五、总结与心得
通过邻接矩阵输出顶点的邻接点比二叉树通过顺序存储和链接存储输出的算法容易