一:图的概念,图模拟一组连接;可以认为是连接关系的集合。
例如:我们将A认识B记录为:A-->B,
将A认识C记录为:A-->C,
将C认识D记录为:C-->D,
那么类似的这样一组关系集合就可以称为图。
其中A,B,C,D我们称之为节点,他们之间的关系称之为路径
那么图的广度优先遍历问题就可以概括为:从节点1到节点2有无路径的问题。也可以回答路径最短问题
如上面的例子,假如A要找到D,由于使用的是广度优先遍历,因此,我们先从A认识的人中找,在从A认识的人中
(B,C)认识的人中找直到找到最后
-- Lua代码
-- 广度优先
local nameTable = {
["you"] = {"Lily", "Lucy", "Jack"},
["Jack"] = {"Jone", "Bob", "Pitter"},
["Lily"] = {"Kim", "Ken"},
["Lucy"] = {"Tom", "Matin"},
["Matin"] = {"Naruato"},
["Naruato"] = {"Sakura", "Sasukai", "Hinata"}
}
function Find(tab, destination, key)
if tab == nil then
return
end
print("新一轮")
local tmpQueue = {}
for i = 1, #tab do
-- print(tab[i] .. " Line 18")
if tab[i] == destination then
-- Find(nameTable["you"], key, "you")
print(key .." Find " .. destination)
return
else
if nameTable[tab[i]] == nil then
else
for j = 1, #nameTable[tab[i]] do
table.insert(tmpQueue, #tmpQueue + 1, nameTable[tab[i]][j]) -- 新找到的人加入表,待本轮结束后继续进行搜索
end
end
end
end
if #tmpQueue == 0 then
-- 执行到这里就没找到了
else
Find(tmpQueue, destination, key)
end
end
Find(nameTable["you"], "Hinata", "you")
执行结果:
新一轮
新一轮
新一轮
新一轮
you Find Hinata -- 执行四轮找到目标
假如我们将
["Jack"] = {"Jone", "Bob", "Pitter"}, 改为 ["Jack"] = {"Jone", "Bob", "Pitter","Hinata"},
结果将变成
新一轮
新一轮
you Find Hinata -- 执行两轮
-- 有错欢迎指出 --
浙公网安备 33010602011771号