数据结构之图的DFS和BFS递归与非递归遍历

该博客详细介绍了图的深度优先搜索(DFS)和广度优先搜索(BFS)在邻接矩阵和邻接表两种数据结构下的递归与非递归遍历方法,涵盖了从基础概念到具体实现的全面讲解。
摘要由CSDN通过智能技术生成

一、邻接矩阵的DFS递归遍历

/*
Author: luuuuyang
Date: 2018/11/1
Version 1.0
Functions:创建无向网络邻接矩阵即带权无向图+递归DFS遍历 
*/
#include<iostream>
#include<cstring>
using namespace std;
#define MaxInt 32767//表示无穷大(大于任何权值) 
#define MVnum 100 //Max Vertex Number 
typedef char VertexType;//顶点数据类型 
typedef int ArcType;//权值数据类型 
typedef struct{
	VertexType vexs[MVnum];//保存顶点的数组 
	ArcType arcs[MVnum][MVnum];//arcs[i][j]=w 
	int vexnum,arcnum;//顶点数;边数 
}AMGraph;
int LocateVex(AMGraph G,VertexType v){//查找v在G中的数组下标 
	for(int i=0;i<G.vexnum;i++)
		if(G.vexs[i]==v){
			return i;
			break;
		}
}
void CreateUDN(AMGraph &G){
	cout<<"请输入无向网络的顶点数和边数:";
	cin>>G.vexnum>>G.arcnum;//输入无向网的顶点数和边数
	cout<<"请输入这"<<G.vexnum<<"顶点的名称:";
	for(int i=0;i<G.vexnum;i++) cin>>G.vexs[i];//保存顶点信息 
	for(int i=0;i<G.vexnum;i++)//初始化所有边的权值为无限大 
		for(int j=0;j<G.vexnum;j++)
			G.arcs[i][j]=MaxInt;
	VertexType v1,v2;//定义两点和一边 
	ArcType w;
	cout<<"请输入两顶点以及两顶点的权值:"<<endl;
	for(int k=0;k<G.arcnum;k++){
		cin>>v1>>v2>>w;//输入两点和一边 
		int i=LocateVex(G,v1);//查找v1,v2在顶点数组中的下标 
		int j=LocateVex(G,v2);
		G.arcs[i][j]=w;//赋值  i->j=w   j->i=w 
		G.arcs[j][i]=w;
	}
}
bool visit[MVnum];
void DFS_AM(AMGraph G,int v){
	cout<<G.vexs[v];
	visit[v]=1;
	for(int w=0;w<G.vexnum;w++)
		if(G.arcs[v][w]!=MaxInt&&!visit[w]) DFS_AM(G,w);
} 
int main(){
	memset(visit,0,sizeof(visit));
	AMGraph G;
	CreateUDN(G);
	cout<<"邻接矩阵递归DFS遍历的结果为:"; 
	DFS_AM(G,0);
	return 0;
} 

二、邻接矩阵的DFS非递归遍历

/*
Author: luuuuyang
Date: 2018/11/3
Version 1.0
Functions:创建无向网络邻接矩阵即带权无向图+非递归DFS遍历 
*/
#include<iostream>
#include<cstring>
using namespace std;
#define MaxInt 32767//表示无穷大(大于任何权值) 
#define MVnum 100 //Max Vertex Number 
typedef int ElemType;
typedef enum{
    OVERFLOW=-1,
    ERROR=0,
    OK=1
}Status;
typedef struct StackNode{
    ElemType data;
    struct StackNode *next;
}StackNode,*LinkStack;
Status InitStack(LinkStack &S){
    S=NULL;
    return OK;
}
bool StackEmpty(LinkStack S){
    return S?false:true;
}
Status Push(LinkStack &S,ElemType e){
    StackNode *p=new StackNode;
    p->data=e;
    p->next=S;
    S=p;
    return OK;
}
Status Pop(LinkStack &S,ElemType &e){
    if(StackEmpty(S)) return ERROR;
    e=S->data;
    StackNode *p=S;
    S=S->next;
    delete p;
    return OK;
}
typedef char VertexType;//顶点数据类型 
typedef int ArcType;//权值数据类型 
typedef struct{
	VertexType vexs[MVnum];//保存顶点的数组 
	ArcType arcs[MVnum][MVnum];//arcs[i][j]=w 
	int vexnum,arcnum;//顶点数;边数 
}AMGraph;
int LocateVex(AMGraph G,VertexType v){//查找v在G中的数组下标 
	for(int i=0;i<G.vexnum;i++)
		if(G.vexs[i]==v){
			return i;
			break;
		}
}
void CreateUDN(AMGraph &G){
	cout<<"请输入无向网络的顶点数和边数:";
	cin>>G.vexnum>>G.arcnum;//输入无向网的顶点数和边数
	cout<<"请输入这"<<G.vexnum<<"顶点的名称:";
	for(int i=0;i<G.vexnum;i++) cin>>G.vexs[i];//保存顶点信息 
	for(int i=0;i<G.vexnum;i++)//初始化所有边的权值为无限大 
		for(int j=0;j<G.vexnum;j++)
			G.arcs[i][j]=MaxInt;
	VertexType v1,v2;//定义两点和一边 
	ArcType w;
	cout<<"请输入两顶点以及两顶点的权值:"<<endl;
	for(int k=0;k<G.arcnum;k++){
		cin>>v1>>v2>>w;//输入两点和一边 
		int i=LocateVex(G,v1);//查找v1,v2在顶点数组中的下标 
		int j=LocateVex(G,v2);
		G.arcs[i][j]=w;//赋值  i->j=w   j->i=w 
		G.arcs[j][i]=w;
	}
}
bool visit[MVnum];
void DFS_AM(AMGraph G,LinkStack &S,int v){
	Push(S,v);
	visit[v]=1;
	while(!StackEmpty(S)){
		ElemType e;
		Pop(S,e);
		cout<<G.vexs[e];
		for(int w=G.vexnum-1;w
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值