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

来源:互联网 发布:php优化方案 编辑:程序博客网 时间:2024/05/20 02:21

实验6:图的实验1

                               -图的邻接矩阵存储实现

一、实验目的

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

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

3、   学会图的遍历算法。


二、实验内容

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

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

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

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


三、算法分析

1、构造函数:将顶点信息存入vertex数组,再依次输入每条边存入邻接矩阵arc中

2、深度优先遍历:先访问顶点v,再判断其相邻顶点是否存在(arc[v][j] ?= 1)以及是否访问过(visited[j] ?= 0),判断成立则递归调用该函数

3、广度优先遍历:先访问顶点v,将v入队;将v出队,访问v的相邻顶点。

四、代码实现

#include<iostream>using namespace std;const int Max = 10;template<class T>class MGraph{public:MGraph(T a[],int n,int e);   //n个结点e条边的图~MGraph(){}void DFSTraverse(int v);    //深度优先遍历void BFSTraverse(int v);    //广度优先遍历void visit();private:T vertex[Max];int arc[Max][Max];int vertexNum,arcNum;int visited[Max];int Q[Max];int front,rear;};//构造函数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(int j=0;j<vertexNum;j++)arc[i][j] = 0;cout<<"请输入边(两端的顶点下标):"<<endl;for(int k=0;k<arcNum;k++){cin>>i>>j;arc[i][j]=1;arc[j][i]=1;cout<<"该边为:"<<vertex[i]<<vertex[j]<<endl;}}//定义一个将visiited[]初始化为0的函数,每次遍历前先调用该函数template<class T>void MGraph<T>::visit(){for(int i=0;i<Max;i++){visited[i]=0;}}//深度优先遍历template<class T>void MGraph<T>::DFSTraverse(int v)    //以v为起点{cout<<vertex[v]; visited[v]=1;for(int j=0;j<vertexNum;j++){if(arc[v][j]==1 && visited[j]==0){DFSTraverse(j);     //访问与v相邻且未被访问过的点}}}//广度优先遍历template<class T>void MGraph<T>::BFSTraverse(int v){//将队列置为空front=rear=-1;cout<<vertex[v]; visited[v]=1; Q[++rear]=v;   //结点v入队while(front!=rear){v=Q[++front];   //v出队for(int j=0;j<vertexNum;j++){       //访问所有与v相邻的顶点if(arc[v][j]==1 && visited[j]==0){cout<<vertex[j]; visited[j]=1;Q[++rear]=j;}}}}//主函数int main(){char arr[Max];int a,c=0,flag=1,tab,n;cout<<"请按序输入图的顶点:";for(int i=0; i<Max; i++){cin>>arr[i];if(arr[i] == '#')  break;c++;}cout<<"请输入该图的边数:";cin>>a;MGraph<char> m(arr,c,a);cout<<"请选择深度/广度优先遍历:"<<endl;while(flag){cout<<"[1]深度   [2]广度\t:";cin>>tab;cout<<"请输入起点下标:";switch(tab){case 1:  { cin>>n;m.visit();cout<<"[深度]";m.DFSTraverse(n);cout<<endl;break;}case 2:  { cin>>n;m.visit();cout<<"[广度]";m.BFSTraverse(n);cout<<endl;break;}default:{flag=0;cout<<"不存在该命令!"<<endl;    break;}}}return 0;}


五、运行结果

原创粉丝点击