图论(四) 图的遍历 【DFS、BFS】

本文深入探讨了图论中的核心算法——图的遍历,包括深度优先遍历(DFS)和广度优先遍历(BFS)。通过邻接矩阵和邻接表两种方式实现了这两种遍历方法,为读者提供了全面的算法实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图建构好后,针对具体的问题,我们常常需要通盘的读取图中的信息,包括顶点(vertexvertexvertex)和边(edgeedgeedge),以及它们之间的关系。这种读取图中所有信息的方法就是图的遍历(traversaltraversaltraversal),也称为搜索(searchsearchsearch),就是从图中某个顶点出发,沿着一些边访问图中所有的顶点,且使每个顶点仅被访问一次。遍历是很多图论算法的基础。

常用的图的遍历方法有DFSDFSDFS(depthdepthdepth firstfirstfirst searchsearchsearch)与BFSBFSBFS(breadthbreadthbreadth firstfirstfirst searchsearchsearch)

DFS(深度优先遍历)

深度优先遍历(DepthDepthDepth FirstFirstFirst SearchSearchSearch),也被称为深度优先搜索,简称DFSDFSDFS

简单来说,就好比在房间中寻找钥匙,这个时候有很多种寻找方案,而我们采用DFSDFSDFS的思想,就无论从哪个房间开始寻找都可以,比如主卧室,然后从房间中的每一个角开始,将房间内的墙角、床头柜、床上、床下等挨个寻找,做到不放过任何一个角落,等每个角落都寻找完后,再寻找下一间,直到找到为止

邻接矩阵实现

typedef char VextexType;  //顶点类型(自定义)
typedef int EdgeType;    //边上权值类型(自定义)
#define MAXVEX 100      //最大顶点数
#define INFINITY 65535  //代替 无穷
typedef struct {
	VextexType vexs[MAXVEX];  //顶点表
	EdgeType arc[MAXVEX][MAXVEX];  //邻接矩阵
	int numVextexes, numEdges;  //图中当前顶点数和边数
}MGraph;


bool visited[MAXVEX];  //访问记录
//DFS递归算法
void DFS(MGraph G, int i) {
	int j;
	visited[i] = true;  //首先标记为已访问
	//接题意要求的操作
	cout << G.vexs[i];
	for (j = 0; j < G.numVextexes; ++j) {
		//如果还有邻接点未被访问,则继续访问
		if (G.arc[i][j] == 1 && !visited[j])
			DFS(G,j);
	}
}
//DFS操作
void DFSTraverse(MGraph G) {
	int i;
	//初始化访问记录表
	for (i = 0; i < G.numVextexes; ++i) {
		visited[i] = false;
	}
	//遍历每一个顶点
	for (i = 0; i < numVextexes; ++i) {
		if (!visited[i])
			DFS(G, i);
	}
}

邻接表实现

typedef char VertexType;
typedef int EdgeType;
#define MAXVEX 100
typedef struct EdgeNode {
	int adjvex;
	EdgeType weight;
	struct EdgeNode *next;
}EdgeNode;

typedef struct VertexNode {
	VertexType data;
	EdgeNode *firstedge;
}VertexNode, AdjList[MAXVEX];

typedef struct {
	AdjList adjList;
	int numVextexes, numEdges;
}GraphAdjList;


bool visited[MAXVEX];  //访问记录
void DFS(GraphAdjList G, int i) {
	EdgeNode *p;
	cout << G.adjList[i].data;  //操作
	p = G.adjList[i].firstedge;  
	//如果这条路还没走完则继续走
	while (p) {
		if (!visited[p->adjvex])
			DFS(G, p->adjvex);
		p = p->next;
	}
}
//DFS操作
void DFSTraverse(GraphAdjList G) {
	int i;
	//初始化访问记录
	for (i = 0; i < numVextexes; ++i) {
		visited[i] = false;
	}
	//遍历每一个顶点
	for (i = 0; i < numVextexes; ++i) {
		if (!visited[i])
			DFS(G, i);
	} 
}

BFS(广度优先遍历)

广度优先遍历(BreadthBreadthBreadth FirstFirstFirst SerachSerachSerach),又称广度优先搜索,简称BFSBFSBFS
在这里插入图片描述

邻接矩阵实现

void BFSTraverse(MGraph G) {
	int i,j;
	queue<int> q;
	for (i = 0; i < G.numVertexes; ++i) {
		visited[i] = false;
	}
	for (i = 0; i < G.numVextexes; ++i) {
		if (!visited[i])
			visited[i] = true;
		cout << G.vexs[i];
		q.push(G.vexs[i]);
		while (!q.empty()) {
			VextexType temp = q.pop();
			for (j = 0; j < G.numVextexes; ++j) {
				if (G.arc[i][j] == 1 && !visited[j]) {
					visited[j] = true;
					cout << G.vexs[j];
					q.push(G.vexs[j]);
				}
			}
		}
	}
}

邻接表实现

void BFSTraverse(GraphAdjList G) {
	int i;
	EdgeNode *p;
	queue<int> q;
	//初始化访问记录
	for (i = 0; i < G.numVextexes; ++i) {
		visited[i] = false;
	}
	//遍历每个顶点
	for (i = 0; i < G.numVextexes; ++i) {
		if (!visited[i]) {
			visited[i] = true;
		}
		cout << G.adjList[i].data;
		q.push(i);
		while (!q.empty()) {
			q.pop();
			p = G.adjList[i].firstedge;
			while (p) {
				if (!visited[p->adjvex]) {
					visited[p->adjvex] = true;
					cout << G.adjList[p->adjvex].data;
					q.push(p->adjvex);
					p = p->next;
				}
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值