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

一、实验目的

 1、 熟练理解图的相关概念;

 2、 掌握图的邻接矩阵的存储方法的实现;

 3、 学会图的遍历算法 

二、 实验内容 

1、自己确定一个简单无向图(顶点数、和相关结点信息)利用邻接矩阵来实现存储。实现 图的构造,并完成:

 1) 用深度优先和广度优秀两种算法对图进行遍历,输出顶点序列数据;

 2) 以合理的格式,输出各个顶点的邻接点;

 2、试设计一个程序,对一个有向简单图,完成上题同样的任务(*) 。 

三、实验步骤

 1、依据实验内容,先确定具体的图,并说明图的顶点数据类型;

 2、设计具体的算法;

 3、写出完整程序; 

4、总结、运行结果和分析算法效率。 

算法设计:

1、构造函数

1.确定图的顶点个数和边的个数;

2.输入顶点信息存储在一维数组vertex中;

3.初始化邻接矩阵;

4.依次输入每条边存储在邻接矩阵arc中:

    4.1    输入边依附的两个顶点的编号i,j;

    4.2    将邻接矩阵的第i行第j列的元素值置为1;

    4.3    将邻接矩阵的第j行第i列的元素值置为1;

2、深度优先遍历

1.访问顶点v;visited[v]=1;

2.w=顶点v的第一个邻接点;

3.while(w存在)

    3.1    if (w未被访问)从顶点w出发递归执行该算法;

    3.2    w=顶点v的下一个邻接点;

3、广度优先遍历

1.初始化队列Q;

2.访问顶点v;visited[v]=1;顶点v入队列Q;

3.while(w存在)

    3.1    v=队列Q的队头元素出队;

    3.2    w=顶点v的第一个邻接点;

        3.3.1    如果w未被访问,则访问顶点w;visited[w]=1;顶点w入队列Q;

        3.3.2    w=顶点的下一个邻接点;

源程序如下:

#include<iostream>
using namespace std;
const int MaxSize=10; //图中最多顶点个数
template<class DataType>
class MGraph
{
public:
MGraph(DataType a[],int n,int e); //构造函数,建立具有n个顶点e条边的图
~MGraph() {} //析构函数为空
void DFSTraverse(int v); //深度优先遍历图
void BFSTraverse(int v); //广度优先遍历图
private:
DataType vertex[MaxSize]; //存放图中顶点的数组
int arc[MaxSize][MaxSize]; //存放图中边的数组
int vertexNum,arcNum; //图中顶点数和边数
};


template<class DataType>
MGraph<DataType>::MGraph(DataType 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<<"请输入边的两个顶点的序号:";
cin>>i>>j;
arc[i][j]=1;
arc[j][i]=1;
}
}


template<class DataType>
void MGraph<DataType>::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);
}


template<class DataType>
void MGraph<DataType>::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;
}
}
}


int visited[MaxSize]={0};


int main()
{
char ch[]={'W','E','I','N','I'}; //顶点信息
MGraph<char>MG(ch,5,6); //图中顶点的类型为char型
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<<"广度优先遍历序列是:";
MG.BFSTraverse(0); //从顶点0出发广度优先遍历
cout<<endl;
return 0;
}

运行结果如图:






猜你喜欢

转载自blog.csdn.net/Ulong_/article/details/80483104