#include<iostream>
const int MAX_VERTEX = 10;
using namespace std;
int visitd[MAX_VERTEX] = {
0};//设置标志变量,并且初始化 0
class MGraph{
private:
int vertex[MAX_VERTEX] ;//定义顶点表
int arc[MAX_VERTEX][MAX_VERTEX];//定义邻接矩阵
int vertexNum,arcNum;//定义顶点个数,和边的个数
public:
MGraph(int vertex[],int n,int e) ;//n 各节点 e 条边
~MGraph();
void printfMGraph();//打印邻接矩阵
void DFSTraverse(int v);//深度遍历
void DFSRecursion(int v);//非递归遍历
void BFSTraverse(int v);//广度遍历
};
MGraph::MGraph(int v[],int n,int e){
vertexNum = n;//初始化顶点个数
arcNum = e;//初始化边的个数
for(int i=0;i<vertexNum;i++){
//初始化图顶点
vertex[i] = v[i];
}
for(int i=0;i<vertexNum;i++){
//矩阵初始化 0
for(int j=0;j<vertexNum;j++){
arc[i][j]=0;
}
}
int vi,vj;
for(int i=0;i<arcNum;i++){
//输入对应的边关系 无向图是对称的
cin>>vi>>vj;
arc[vi][vj]=1;
arc[vj][vi]=1;
}
}
void MGraph::printfMGraph(){
//打印图
for(int i=0;i<vertexNum;i++){
for(int j=0;j<vertexNum;j++){
cout<<arc[i][j]<<" ";
}
cout<<"\n";
}
}
void MGraph::DFSTraverse(int v){
//深度优先遍历 递归方式 (使用系统栈方式)
int n = vertexNum;//获取顶点个数
if(v<0||v>n) throw "位置出错";
cout<<vertex[v]<<" "; //打印顶点信息
visitd[v]=1;// 0 表示为遍历 1 表示遍历过 ,设置为已经遍历过
for(int i =0;i<n;i++){
//查看某个顶点的相邻表,只需要看对应顶点的行即可
if(visitd[i] == 0 && arc[v][i]!=0){
//符合要求 表示找到未被遍历的点
DFSTraverse(i);
}
}
}
void MGraph::DFSRecursion(int v){
int n = vertexNum;//获取顶点个数
if(v<0||v>n) throw "位置出错";
int stackGraph[n],top=-1,i;//设置栈 和 栈指针
cout<<vertex[v]<<" ";
visitd[v]=1;
stackGraph[++top]=v;
while(top!=-1){
v = stackGraph[top];
for(i=0;i<n;i++){
if(visitd[i] == 0 && arc[v][i]!=0){
cout<<vertex[i]<<" ";
visitd[i]=1;
stackGraph[++top]=i;
break;
}
}
if(i==n){
//没有可用的点了,出栈减一
top--;
}
}
}
void MGraph::BFSTraverse(int v){
//广度优先遍历,使用队列实现,
int n = vertexNum;
if(v<0||v>n) throw "位置错误";
int queueGraph[MAX_VERTEX],front=-1,tail=-1;//定义队列,和头指针和尾指针
cout<<vertex[v]<<" ";//输出首个顶点
visitd[v]=1;//设置已读
queueGraph[++tail] = v;//顶点入队
while(front!=tail){
//队列不为空,一直循环
v = queueGraph[++front];//顶点出队
for(int i=0;i<n;i++){
//循环查找未被遍历的
if(visitd[i]==0&&arc[v][i]!=0){
cout<<vertex[i]<<" ";//打印顶点
visitd[i]=1;//设置已读
queueGraph[++tail]=i;//顶点入队
}
}
}
}
int main(){
int v[]={
0,1,2,3,4,5,6};//顶点信息
MGraph* mg = new MGraph(v,7,9); // 通过顶点数组,点数,边数构造图
mg->printfMGraph();//打印邻接矩阵
mg->DFSTraverse(0);//深度遍历
for(int i=0;i<MAX_VERTEX;i++){
visitd[i]=0;
}
cout<<"\n深度非递归遍历\n";
mg->DFSRecursion(0);//深度非递归
for(int i=0;i<MAX_VERTEX;i++){
visitd[i]=0;
}
cout<<"\n广度遍历\n";
mg->BFSTraverse(0);//广度遍历
return 0;
}
邻接矩阵的深度遍历和深度遍历
猜你喜欢
转载自blog.csdn.net/NewDay_/article/details/109102388
今日推荐
周排行