c++广度优先搜索

在这里插入图片描述
比如,在上面这个简单的有向图上面实现从某个节点开始的广度优先搜索。完整代码在最下方第5小节。

1. 首先建图

struct SimpleGraph {
	std::unordered_map<char, std::vector<char>> edges;

	std::vector<char> neighbors(char id) {
		return edges[id];
	}
};

SimpleGraph example_graph{ {
	{'A',{'B'}},
	{'B',{'C'}},
	{'C',{'B','D','F'}},
	{'D',{'C','E'}},
	{'E',{'F'}},
	{'F',{}},
} };

2. 广度优先搜索

void breadth_first_search(SimpleGraph graph, char start) {
	std::queue<char> frontier;
	frontier.push(start);

	std::unordered_set<char> reached;
	reached.insert(start);

	while (!frontier.empty()) {
		char current = frontier.front();
		frontier.pop();

		std::cout << "visiting " << current << std::endl;
		for (char next : graph.neighbors(current)) {
			if (reached.find(next) == reached.end()) {
				// 说明该点没有被访问过
				 
				// 则加入队列,以后要访问它的邻居
				frontier.push(next);
				// 该点已被访问
				reached.insert(next);
			}
		}
	}
}

3. 测试

std::cout << "reachable from A: " << std::endl;
breadth_first_search(example_graph, 'A');
std::cout << "reachable from E: " << std::endl;
breadth_first_search(example_graph, 'E');

4. 结果

在这里插入图片描述

5. 完整代码

#include<iostream>
#include<unordered_map>
#include<vector>
#include<queue>
#include<unordered_set>

struct SimpleGraph {
	std::unordered_map<char, std::vector<char>> edges;

	std::vector<char> neighbors(char id) {
		return edges[id];
	}
};

SimpleGraph example_graph{ {
	{'A',{'B'}},
	{'B',{'C'}},
	{'C',{'B','D','F'}},
	{'D',{'C','E'}},
	{'E',{'F'}},
	{'F',{}},
} };

void breadth_first_search(SimpleGraph graph, char start) {
	std::queue<char> frontier;
	frontier.push(start);

	std::unordered_set<char> reached;
	reached.insert(start);

	while (!frontier.empty()) {
		char current = frontier.front();
		frontier.pop();

		std::cout << "visiting " << current << std::endl;
		for (char next : graph.neighbors(current)) {
			if (reached.find(next) == reached.end()) {
				// 说明该点没有被访问过
				 
				// 则加入队列,以后要访问它的邻居
				frontier.push(next);
				// 该点已被访问
				reached.insert(next);
			}
		}
	}
}

int main()
{
	std::cout << "reachable from A: " << std::endl;
	breadth_first_search(example_graph, 'A');
	std::cout << "reachable from E: " << std::endl;
	breadth_first_search(example_graph, 'E');

	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值