算法系列—广度优先搜索(BFS)

单点最短路径:给定一幅图和一个顶点s,从s到给定的顶点v是否存在一条路径?如果有,找出其中最短的那一条。

解决这个问题的经典方法叫做广度优先搜索。


广度优先搜索思路:

要找到从s到v的最短路径,从s开始,在所有由一条边就可以到达的顶点中寻找v,如果找不到,就继续在距离两条边的顶点中查找v,如此一直执行。

C++实现代码如下:
//BFS.cpp
//无向图
#include <iostream>
#include <list>
#include <queue>
using namespace std;

class Graph
{
	int count = 0;//顶点数
	list<int> *adj;	//邻接表
	bool *visited;
public:
	void addEdge(int v, int w);	//向图中添加边
	void BFS(int v);	//广度优先搜索接口
	Graph(int count);
};

Graph::Graph(int count)
{
	this->count = count;
	adj = new list<int>[count];
	visited = new bool[count];
	for (int i = 0; i < count; ++i)
		visited[i] = false;
}

void Graph::addEdge(int v, int w)
{
	adj[v].push_back(w);
	adj[w].push_back(v);
}

void Graph::BFS(int v)
{
	queue<int> queue_node;	//用队列保存下一步要访问的元素
	visited[v] = true;
	queue_node.push(v);
	while(!queue_node.empty())
	{
		int s=queue_node.front();
		cout << s << " ";
		queue_node.pop();
		for (int w : adj[s])
		{
			if (!visited[w]) {
				visited[w] = true;
				queue_node.push(w);
			}
		}
	}
}

/* 测试 */
int main()
{
	Graph g(5);
	g.addEdge(0, 1);
	g.addEdge(0, 2);
	g.addEdge(2, 3);
	g.addEdge(3, 3);
	g.addEdge(0, 4);
	cout << "从2开始深度搜索" << endl;
	g.BFS(2);
	cout << endl;

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值