实验 6:图的实验 1
——图的邻接矩阵存储实现
一、实验目的
1、 熟练理解图的相关概念;
2、 掌握图的邻接矩阵的存储方法的实现;
3、 学会图的遍历算法
二、实验内容
1、自己确定一个简单无向图(顶点数、和相关结点信息)利用邻接矩阵来实现存储。实现图的构造,并完成:
1)用深度优先和广度优秀两种算法对图进行遍历,输出顶点序列数据;
2)以合理的格式,输出各个顶点的邻接点;
2、试设计一个程序,对一个有向简单图,完成上题同样的任(*)。
程序源代码:
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
const MaxSize=10;
class MGraph
{
public:
MGraph(string a[],int n,int e); //构造函数,建立具有n个顶点e条边的图
~MGraph(){}; //析构函数为空
void DFSTraverse() //深度优先遍历图
{
for(int j=0;j<MaxSize;j++)
{
visited[j]=0;
}
DFSTraverse(0);
}
void BFSTraverse(int v); //广度优先遍历函数
void Approximal(); //邻接点函数
private:
string vertex[MaxSize]; //存放图中顶点的数组
void DFSTraverse(int v);
int arc[MaxSize][MaxSize]; //存放图中边的数组
int vertexNum,arcNum; //图的顶点数和边数
int visited[MaxSize];
};
MGraph::MGraph(string a[],int n,int e)
{
vertexNum=n;
arcNum=e;
int i;
for(i=0;i<vertexNum;i++) //存储图的顶点信息
{
vertex[i]=a[i];
}
for(i=0;i<arcNum;i++) //初始化图的邻接矩阵
{
for(int k=0;k<vertexNum;k++)
{
arc[i][k]=0;
}
}
for(i=0;i<arcNum;i++) //存储图的边信息
{
int j,k;
cout<<"请输入边依附的两个点:";
cin>>k>>j;
arc[k][j]=1;
arc[j][k]=1;
}
}
void MGraph::DFSTraverse(int v) //深度优先遍历图
{
cout<<vertex[v];
visited[v] = 1;
for(int i=0;i<vertexNum;i++)
{
if(arc[v][i]==1 && visited[i]==0)
{
DFSTraverse(i);
}
}
}
void MGraph::BFSTraverse(int v) //广度优先遍历图
{
for(int j=0;j<MaxSize;j++) //初始化图中所有顶点均未被访问
{
visited[j]=0;
}
int front,rear;
front=rear=-1; //初始化队列
cout<<vertex[v];
visited[v]=1;
int Q[MaxSize]; //假设队列采用顺序存储且不会发生溢出
Q[++rear]=v; //被访问顶点入队
while(front!=rear) //当队列非空时
{
v=Q[++front]; //将队头元素出队并送到v中
for(int i=0;i<vertexNum;i++)
{
if(arc[v][i]==1 && visited[i]==0)
{
cout<<vertex[i];
visited[i]=1;
Q[++rear]=i;
}
}
}
}
void MGraph::Approximal() //求各顶点邻接顶点函数
{
for(int i=0;i<vertexNum;i++)
{
cout<<vertex[i]<<"的邻接点为:";
for(int j=0;j<vertexNum;j++)
{
if(arc[i][j] == 1)
{
cout<<" "<<vertex[j];
}
}
cout<<endl;
}
}
int main()
{
int n=0,e=0;
string a[MaxSize];
cout<<"请输入顶点数和边数:";
cin>>n>>e;
cout<<"请依次输入顶点内容:";
for(int m=0;m<n;m++)
{
cin>>a[m];
}
MGraph MG(a,n,e);
cout<<"深度遍历:";
MG.DFSTraverse();
cout<<endl;
cout<<"广度遍历:";
MG.BFSTraverse(0); //从顶点0出发广度遍历图
cout<<endl;
cout<<"各个顶点的邻接点:"<<endl;
MG.Approximal();
return 0;
}
运行结果: