mark x as visited
list L = x
tree T = x
while L nonempty
choose some vertex v from front of list
process v
for each unmarked neighbor w
mark w as visited
add it to end of list
add edge vw to T
大多數代碼將選擇在訪問它們之前將相鄰節點標記爲已訪問。首先添加所有鄰居並稍後再訪問它會不會在技術上正確?BFS和術語「訪問」的正確性
list L = x
tree T = x
while L nonempty
choose some vertex v from front of list
if (V NOT YET VISITD)
MARK V AS VISITED HERE
for each unmarked neighbor w
add it to end of list
add edge vw to T
爲什麼每個BFS似乎都會將節點標記爲已訪問,而您甚至沒有訪問它們呢?我正試圖爲BFS找到一個理論上正確的代碼。哪一個是正確的?
回覆:「第二個版本可能會向列表L添加兩次相同的節點」:或者兩次以上。在極端的情況下,如果圖是一個帶* n *頂點的完整圖,那麼一個頂點將被添加一次,一次兩次,一次三次等等,一直向上通過添加的一個頂點(* n * - 1 )次。所以一個在頂點數量上應該是線性的算法是二次的。 – ruakh
@ruakh沒錯,但這只是空間的複雜性而已。完整圖的時間複雜度始終是頂點數的二次方,因爲邊的數量已經是二次的。 – nwellnhof
好點。 (想想看,對於每個未標記的鄰居w'位必須真正意味着'對於每個鄰居w'加上'如果w未被標記')。 – ruakh