Recorrido profundo y recorrido profundo de la matriz de adyacencia

#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;
} 

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/NewDay_/article/details/109102388
Recomendado
Clasificación