文章目录
广度优先搜索
广度优先搜索是一种针对图的查找算法,其可以回答两类问题:
- 从A节点出发,有前往节点B的路径吗?
- 从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;
}