Algorithm第四版算法 C++实现(十四)——广度优先搜索(BFS)

本文详细介绍了广度优先搜索(BFS)算法,通过使用队列(FIFO)特性实现。BFS从起点开始,依次访问与其相邻的顶点,直至遍历整个连通分支。与深度优先搜索(DFS)相比,BFS在某些情况下能获得不同的路径。代码示例展示了如何在C++中实现BFS,包括路径记录和检查顶点是否已被标记的功能。
摘要由CSDN通过智能技术生成

既然上一期说了DFS,这一期当然要来说BFS了。广度优先搜索和DFS还是很相似的,只不过我们会先找出和起点相邻的顶点,然后再依次进入这些顶点,并找到所有与其相邻的顶点,重复上述步骤直到该连通分支的所有节点都被标记。
作者很巧妙的利用了queue的FIFO特性来实现广度优先搜索。(我用STL不是因为懒哈)

路径:

请添加图片描述

in head.h

class BFS
{
private:
	bool *marked;	//标记数组
	std::vector<std::string> path;	//标记路径的数组
	void bfs(graph g, int v);	//广度优先搜索核心
	bool mark(int v);	//返回顶点是否被标记
public:
	BFS(graph g, int s);	//构造函数,第一个参数是图形类,第二个参数起点
	std::string path_to(int v);		//返回路径的字符串
};

in head.cpp

/*广度优先搜索*/
BFS::BFS(graph g, int s)
{
	marked = new bool[g.numv()];
	std::fill(marked, marked + g.numv(), 0);
	path.resize(g.numv());
	path[s] += std::to_string(s);
	bfs(g, s);		//进入函数
}
bool BFS::mark(int v)
{
	return marked[v];
}
void BFS::bfs(graph g, int v)
{
	marked[v] = true;
	std::queue<int> q;	//用了queue STL,需要引入<queue>
	q.push(v);	
	while (!q.empty())
	{
		int w = q.back();
		q.pop();
		std::vector<int> gv = g.iterator(w);
		for (auto i : gv)
		{
			//printf("%d %d\n", w,marked[w]);
			if (!mark(i))
			{
				path[i] = path[w] + " " + std::to_string(w);	
				marked[w] = true;
				q.push(i);	//q用来储存与当前顶点有连接的顶点
			}
		}
	}
	
}
std::string BFS::path_to(int v)
{
	return path[v];
}

运行结果:
在这里插入图片描述
*BFS与DFS产生的路径并不一定相同,相同只是因为碰巧
如果你看过上一期的深度优先搜索,你会发现只有bfs方法与上期略有差别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值