广度优先搜索-python实现

题目背景:假设你经营一个芒果农场,需要寻找芒果销售商,以便将芒果卖给他。在Facebook中,你与芒果销售商有联系吗?

为此,你可在朋友中查找。 

下面的图结构描述了你在facebook中的人脉网,与You直接的相连的是你的朋友,其他的是朋友的朋友,假定姓名以‘m’结尾的是芒果销售商。

要求:实现算法找出图中的芒果供应商。

 

使用广度优先算法来实现。假设图中朋友是一度关系,朋友的朋友是二度关系。

在广度优先搜索的执行过程中,搜索范围从起点开始向外延伸,即先在一度关系中查找,再在二度关系中查找,因此找到的是关系最近的芒果销售商。 只有按照顺序查找时,才能实现这样的目的,因此需要结合队列来实现


from collections import deque

graph = {}
graph["you"] = ["alice", "bob", "claire"]
graph["bob"] = ["anuj", "peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["thom", "jonny"]
graph["anuj"] = []
graph["peggy"] = []
graph["thom"] = []
graph["jonny"] = []


def person_is_seller(name):
	return name[-1] == 'm'

def search(name):
	search_queue = deque()#创建一个队列
	search_queue += graph[name]#将你的邻居都加入到这个搜索队列中
	print(search_queue)

	searched = []#这个数组用于记录检查过的人
	while search_queue:#只要队列不为空
		person = search_queue.popleft()#取出队列中的一个人
		print(person)
		print(search_queue)
		if person not in searched:#仅当这个人内检查过时才检查
			if person_is_seller(person):#检查这个人是否是芒果销售商
				print(person + " is a mango seller!")
				return True
			else:
				search_queue += graph[person]#不是芒果销售商,将这个人的朋友都加入搜索队列
				print(search_queue)
				searched.append(person)#将这个人标记为检查过
				print(searched)
	return False#如果到达了这里,就说明队列中没人是芒果销售商

search("you")

运行结果: 

deque(['alice', 'bob', 'claire'])
alice
deque(['bob', 'claire'])
deque(['bob', 'claire', 'peggy'])
['alice']
bob
deque(['claire', 'peggy'])
deque(['claire', 'peggy', 'anuj', 'peggy'])
['alice', 'bob']
claire
deque(['peggy', 'anuj', 'peggy'])
deque(['peggy', 'anuj', 'peggy', 'thom', 'jonny'])
['alice', 'bob', 'claire']
peggy
deque(['anuj', 'peggy', 'thom', 'jonny'])
deque(['anuj', 'peggy', 'thom', 'jonny'])
['alice', 'bob', 'claire', 'peggy']
anuj
deque(['peggy', 'thom', 'jonny'])
deque(['peggy', 'thom', 'jonny'])
['alice', 'bob', 'claire', 'peggy', 'anuj']
peggy
deque(['thom', 'jonny'])
thom
deque(['jonny'])
thom is a mango seller!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值