图的实验1——图的邻接矩阵存储实现

来源:互联网 发布:知世风涧澈 编辑:程序博客网 时间:2024/05/08 14:42
#include<iostream>  #include<stdlib.h>    using namespace std;  const int Max=10;  //图中最大顶点数int visited[Max]={0};  //设置已访问标志template<class T>  class Graph  {  public:      Graph(T a[],int n,int e);  //构造函数,建立具有n个顶点e条边的图    ~Graph(){};  //析构函数为空    void BFST(int v);  //深度优先遍历图    void DFST(int v);  //广度优先遍历图void Pvertex();  //输出顶点的邻接点private:      T vertex[Max];  //存放图中顶点的一维数组    int arc[Max][Max];  //存放图中边的二维数组    int vertexNum, arcNum;  //图中的顶点数和边数};  template<class T>  Graph<T>::Graph(T 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<<"输入两点的编号:\n";          cin>>i;          cin>>j;                   //输入边依附的两个顶点编号        arc[i][j]=1;arc[j][i]=1;  //置有边标志    }  }  template<class T>  void Graph<T>::DFST(int v)  //深度优先遍历图(递归调用){      int j;      cout<<vertex[v];      visited[v]=1;       //防止重复访问相同顶点    for(j=0;j<vertexNum;j++)          if(arc[v][j]==1&&visited[j]==0) //访问未被访问的边             DFST(j);  }  template<class T>  void Graph<T>::BFST(int v)  //广度优先遍历图(运用队列结构,非递归){      int Q[Max];      int front=-1;   //初始化队列    int 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;              }      }  }  template<class T>void Graph<T>::Pvertex() //显示各个顶点的邻接点信息{int i;int j;            for(i=0;i<vertexNum;i++)  //依次访问每个顶点{        cout<<"顶点"<<vertex[i]<<"的邻接点为:"<<endl;        for(j=0;j<vertexNum;j++)       if(arc[i][j]==1)      //两点确定一条边,即通过边可确定顶点的邻接点,且有可能为多个邻接点  cout<<vertex[j]<<"   ";cout<<endl;}}int main()  {    char S[6]={'A','B','C','D','E','F'};      Graph<char> G(S,6,6);      for(int i=0;i<Max;i++)      {visited[i]=0;}      cout<<"深度优先遍历的序列为:";      G.DFST(0);      cout<<endl;      for(int i=0;i<Max;i++)  {visited[i]=0;}      cout<<"广度优先遍历的序列为:";      G.BFST(0);      cout<<endl;  cout<<"各顶点的邻接点信息如下:"<<endl;G.Pvertex();cout<<endl;    return 0;  }  


一、实验目的

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

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

3、   学会图的遍历算法


二、 实验内容

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

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

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

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


三、实验步骤

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

2、设计具体的算法;

3、写出完整程序;

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

5、总体收获和不足,疑问等。


四、图结构与实验结果截图:




五、心得体会

通过本次实验,我在敲代码以及修改完善程序的过程中进一步理解了图以邻接矩阵实现存储的特点和操作。其过程中我会联想到树和二叉树的存储方式,图很特别的便是一维数组和二维数组相结合起来应用,这样对数组的运用以及期间数据之间的含义和关系的理解和掌握有更大的考验。

其中自己还对图的深度优先遍历和广度优先遍历有了更具体的认识,之前只靠理论没有理解好的点通过实验操作和最终的结果呈现可以更形象表达出来从而更容易让人理解。对图的构造和遍历部分的代码基本都是参考书本的,难度相较小一些,但我在尝试实现对图顶点与其邻接点的查询操作中花了较多的时间研究,反复地通过演算和修改最终做出了上面的效果,这样的实践会对我自己在加深对C++程序设计语言的理解和运用、提高程序编写和设计能力有很大的帮助。