0
点赞
收藏
分享

微信扫一扫

搜索算法(持续更新...)

爱奔跑的读书者 2022-02-06 阅读 58

文章目录

广度优先搜索

广度优先搜索是一种针对图的查找算法,其可以回答两类问题:

  1. 从A节点出发,有前往节点B的路径吗?
  2. 从A节点出发,前往B节点的哪条路最近?

广度优先搜索不仅查找从A到B的路径,而且找到的是最短的路径。

实现图

图的结构可以用散列表来实现,因为它们是一种映射关系。

下图表示的是一种单向关系。

在这里插入图片描述

map<string, set<string>> initial_map() {
	map < string, set<string> > relation_graph;
	relation_graph["me"] = { "alice", "bob", "claire" };
	relation_graph["bob"] = { "anuj", "peggy" };
	relation_graph["alice"] = { "peggy" };
	relation_graph["claire"] = { "thom", "jonny" };
	return relation_graph;
}

实现算法

#include <iostream>
#include <map>
#include <string>
#include <set>
#include <queue>
#include <list>

using namespace std;

map<string, set<string>> initial_map();
bool BFS(map<string, set<string>>& graph, const string start_point);

int main() {
	map < string, set<string> > relation_graph = initial_map();
	if (BFS(relation_graph, "me"))
		cout << "yes" << endl;
	else
		cout << "no" << endl;
}

map<string, set<string>> initial_map() {
	map < string, set<string> > relation_graph;
	relation_graph["me"] = { "alice", "bob", "claire" };
	relation_graph["bob"] = { "anuj", "peggy" };
	relation_graph["alice"] = { "peggy" };
	relation_graph["claire"] = { "thom", "jonny" };
	return relation_graph;
}

bool BFS(map<string, set<string>> &graph, const string start_point){
	// 初始化
	queue<string, list<string>> wait_list;
	set<string> closed_list;
	wait_list.push(start_point);
	// 搜索
	while (!wait_list.empty()) {
		// 出队
		const string target = wait_list.front();
		wait_list.pop();
		// 标记为检查完毕
		closed_list.insert(target);
		// 判断是否为经销商
		if (target.back() == 'm') // 对于单个字符,如果双引号,是const char,如果单引号,是char
			return true;
		// 将朋友入队
		for (auto& bro : graph[target]) // 使用下标符的时候,graph不能为const
			wait_list.push(bro);
	}
	return false;
}
举报

相关推荐

0 条评论