我获得了以下算法:
Breadthfirstsearch(G,s)
for each u ∈ V \ {s}
color[u]<-white
d[u]<-oo
p[u]<-Ø
color[s]<-gray
d[s]<-0
p[s]<-Ø
Q<-Ø // Q is a queue
Insert(Q,s)
while Q ≠ Ø
u<-Delete(Q)
for each v ∈ Adj(u)
if color[v]=white then
color[v]<-gray
d[v]=d[u]+1
p[v]<-u
Insert(Q,v)
color[u]<-black
Delete(Q)
x<-Q[head[Q]]
if head[Q]=length[Q] then
head[Q]<-1
else
head[Q]<-head[Q]+1
return x
在我的笔记中,有以下示例:
一开始就是这样:
在第一个“for”之后,就像那样:
我还没理解,为什么我们从Q中删除s。
使用命令u&lt; -Delete(Q),u变为s的值,变量head [Q]在函数中发生变化,但在主程序中没有变化,或者我错了吗?
答案 0 :(得分:2)
该方法的名称delete()
有点误导,可能更好的名称是deleteAndReturnHead()
。我们的想法是函数返回队列中的“旧”头部(在您的示例中为s
),并将新头部设置为下一个元素(示例中为a
)。
函数Delete()
使用的是队列的实现是circular array这一事实。您将元素设置为return(在示例中为s
),然后您只需将指示队列开始位置的指针前进到下一个元素。圆形部分位于:
if head[Q]=length[Q] then
head[Q]<-1
如果指向头部的指针是最后一个索引,则将指针移动到数组的头部,这是要插入的下一个元素。
由于Q是通过引用传递的(并且每次传递都不会被复制),因此对它的任何更改都将反映到调用环境(BFS procdure)。