图的存储结构及实现(邻接矩阵)

#include

using namespace std;
const int MaxSize=10;//图中最多顶点个数
int visited[MaxSize]= {0}; //全局数组变量visited初始化
template
class MGraph {
public:
MGraph (DataType a[],int n,int e); //构造函数,建立具有n个顶点e条边的图
~MGraph();//析构函数
void DFTraverse (int v); //深度优先遍历图
void BFTraverse (int v); //广度优先遍历图
private:
DataType vertex[MaxSize];//存放图中顶点的数组
int edge[MaxSize][MaxSize];//存放图中边的数组
int vertexNum,edgeNum;//图的顶点数和边数
};
template
MGraph::MGraph (DataType a[],int n,int e) {
int i,j,k;
vertexNum=n;
edgeNum=e;
for (i=0; i<vertexNum; i++) { //存储顶点
vertex[i]=a[i];
}
for (i=0; i<vertexNum; i++) //初始化邻接矩阵
for (j=0; j<vertexNum; j++) {
edge[i][j]=0;
}
for (k=0; k<edgeNum; k++) { //依次输入每一条边
cout<<“请输入边依附的两个顶点的编号:”;
cin>>i>>j;//输入边依附的两个顶点的编号
edge[i][j]=1;//置有边标志
edge[j][i]=1;//置有边标志
}
}
template
MGraph::~MGraph() {}
//图的邻接矩阵存储是静态存储分配,在图变量退出作用域时自动释放所占内存单元,因此,图的邻接矩阵存储无须销毁,析构函数为空
template
void MGraph::DFTraverse (int v) {
cout<<vertex[v];
visited[v]=1;
for (int j=0; j<vertexNum; j++) {
if (edge[v][j]==1&&visited[j]==0) {
DFTraverse (j);
}
}
}
template
void MGraph::BFTraverse (int v) {
int w,j,Q[MaxSize];//采用顺序队列
int front=-1,rear=-1;//初始化队列
cout<<vertex[v];
visited[v]=1;
Q[++rear]=v;//被访问顶点入队
while (front!=rear) { //当队列非空时
w=Q[++front];//将队头元素出队并送到v中
for (j=0; j<vertexNum; j++) {
if (edge[w][j]==1&&visited[j]==0) {
cout<<vertex[j];
visited[j]=1;
Q[++rear]==j;
}
}
}
}
int main() {
char ch[]= {‘a’,‘b’,‘c’,‘d’,‘e’};
MGraph m{ch,5,6};//建立具有5个顶点6条边的无向图
for (int i=0; i<MaxSize; i++) {
visited[i]=0;
}
cout<<“深度优先遍历序列为:”<<endl;
m.DFTraverse (0); //从顶点0出发进行深度优先遍历
cout<<endl;
for (int i=0; i<MaxSize; i++) {
visited[i]=0;
}
cout<<“广度优先遍历序列为:”<<endl;
m.BFTraverse (0); //从结点0出发进行广度优先遍历
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值