先遍歷離起點近的,再到遠的,直至全圖。先遍歷所有與起點距離為1的點,再到所有距離為2的點……
具體實現,需要壹個隊列進行輔助存儲。
舉個例,S為起點,S到A,B,C3個點相鄰。A又與A1,A2相鄰,B與B1,B2相鄰,C沒有與其他點相鄰。對於遍歷A發生的事情,就是“發現”了A1,A2。但是,這是不能立即遍歷A1,A2,這與BFS宗旨違背,必須先遍歷B,C。而又由於B,C肯定是比A1,A2先“發現”,這就體現了壹種“先進先出”的性質,因而需要隊列對為擴展的結點進行暫存
BFS()
{
queue q;
q.push(s);//壹開始的s點
while(q非空)
{
從q中取壹元素
將該元素“發現”,而又未被進過q的結點入隊
}
}
DFS,深度優先搜索
先選定壹條路徑,對路徑上的點進行遍歷。然後,從路徑的盡頭開始,逐步回退,在每個分支再遍歷其他路徑及其上面的點。
具體實現,常寫作遞歸,故可理解為通過棧輔助存儲。
還是上面的距離,DFS出來的其中壹種序列是S,A,A1,A2,B,B1,B2,C。路徑S,A,A1為第壹選取的路徑,然後回退,逐步選取其他分支,在A選取了A2作為第二路徑,以此類推。由於這樣對每個點所做的操作就是“發現”,“遍歷”與“回退”,操作種類相同,故常寫作遞歸。。。
DFS(int target)
{
for(target的每個發現點)
{
DFS(該發現點)
}
//結束函數實際上就是回退的過程
}