一、实验目的
1、 熟练理解图的相关概念;
2、 掌握图的邻接矩阵的存储方法的实现;
3、 学会图的遍历算法
1、自己确定一个简单无向图(顶点数、和相关结点信息)利用邻接矩阵来实现存储。实现图的构造,并完成:
1)用深度优先和广度优秀两种算法对图进行遍历,输出顶点序列数据;
2)以合理的格式,输出各个顶点的邻接点;
2、试设计一个程序,对一个有向简单图,完成上题同样的任务(*)。
三、实验步骤
1、依据实验内容,先确定具体的图,并说明图的顶点数据类型;
2、设计具体的算法;
3、写出完整程序;
4、总结、运行结果和分析算法效率。
5、总体收获和不足,疑问等。
四、实验要求
1、 按照数据结构实验任务书,提前做好实验预习与准备工作。
2、 在个人主页上发文章提交作业。
实验课会抽查3-5人,希望你可以被查到!
五、源代码
#include<iostream>
using namespace std;
const int maxsize=10;
int visited[maxsize];
template<class T>
class MGraph
{
public:
MGraph(T a[],int n,int e);
~MGraph(){}
void dfs(int v);
void bfs(int v);
private:
T vertex[maxsize];
int arc[maxsize][maxsize];
int vertexnum,arcnum;
};
template<class T>
MGraph<T>::MGraph(T a[],int n,int e)
{
int i,j;
vertexnum=n;
arcnum=e;
for(i=0;i<vertexnum;i++)
vertex[i]=a[i];
for(i=0;i<vertexnum;i++)
for(j=0;j<arcnum;j++)
arc[i][j]=0;
for(int k=0;k<arcnum;k++)
{
cout<<"请输入边依附的两个顶点的序号:";
cin>>i>>j;
arc[i][j]=1;
arc[j][i]=1;
}
}
template<class T>
void MGraph<T>::dfs(int v)
{
int i,j;
cout<<vertex[v]<<" ";
visited[v]=1;
for(j=0;j<vertexnum;j++)
if(arc[v][j]==1 && visited[j]==0)
dfs(j);
}
template<class T>
void MGraph<T>::bfs(int v)
{
int Q[maxsize];
int front,rear;
front=rear=-1;
cout<<vertex[v]<<" ";
visited[v]=1;
Q[++rear]=v;
while(front!=rear)
{
v=Q[++front];
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 main()
{
int a[maxsize];
int n,e,i;
for(i=0;i<maxsize;i++)
visited[i]=0;
cout<<"请输入顶点数和边数:";
cin>>n>>e;
cout<<endl;
cout<<"请输入顶点:";
for(i=0;i<n;i++)
cin>>a[i];
cout<<endl;
MGraph<int>graph(a,n,e);
cout<<endl<<endl;
cout<<"深度优先遍历:";
graph.dfs(0);
cout<<endl<<endl;
for(i=0;i<maxsize;i++)
visited[i]=0;
cout<<"广度优先遍历:";
graph.bfs(0);
cout<<endl<<endl;
return 0;
}
六、运行结果