实验 6:图的实验 1 -图的邻接矩阵存储实现

本文介绍了一种使用邻接矩阵存储无向图的方法,并实现了深度优先和广度优先遍历算法。此外,还展示了如何输出图中各顶点的邻接点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验目的 

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;

}

四、运算结果


五、总结与心得

通过邻接矩阵输出顶点的邻接点比二叉树通过顺序存储和链接存储输出的算法容易

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值