深度優先遍歷html
1.深度優先遍歷的遞歸定義web
假設給定圖G的初態是全部頂點均不曾訪問過。在G中任選一頂點v爲初始出發點(源點),則深度優先遍歷可定義以下:首先訪問出發點v,並將其標記爲已訪問過;而後依次從v出發搜索v的每一個鄰接點w。若w不曾訪問過,則以w爲新的出發點繼續進行深度優先遍歷,直至圖中全部和源點v有路徑相通的頂點(亦稱爲從源點可達的頂點)均已被訪問爲止。若此時圖中仍有未訪問的頂點,則另選一個還沒有訪問的頂點做爲新的源點重複上述過程,直至圖中全部頂點均已被訪問爲止。算法
圖的深度優先遍歷相似於樹的前序遍歷。採用的搜索方法的特色是儘量先對縱深方向進行搜索。這種搜索方法稱爲深度優先搜索(Depth-First Search)。相應地,用此方法遍歷圖就很天然地稱之爲圖的深度優先遍歷spa
2.基本實現思想:orm
(1)訪問頂點v;htm
(2)從v的未被訪問的鄰接點中選取一個頂點w,從w出發進行深度優先遍歷;blog
(3)重複上述兩步,直至圖中全部和v有路徑相通的頂點都被訪問到。遞歸
3.僞代碼隊列
遞歸實現ci
(1)訪問頂點v;visited[v]=1;//算法執行前visited[n]=0
(2)w=頂點v的第一個鄰接點;
(3)while(w存在)
if(w未被訪問)
從頂點w出發遞歸執行該算法; w=頂點v的下一個鄰接點;
非遞歸實現
(1)棧S初始化;visited[n]=0;
(2)訪問頂點v;visited[v]=1;頂點v入棧S
(3)while(棧S非空)
x=棧S的頂元素(不出棧);
if(存在並找到未被訪問的x的鄰接點w)
訪問w;visited[w]=1;
w進棧;
else
x出棧;
廣度優先遍歷
1.廣度優先遍歷定義
圖的廣度優先遍歷BFS算法是一個分層搜索的過程,和樹的層序遍歷算法類同,它也須要一個隊列以保持遍歷過的頂點順序,以便按出隊的順序再去訪問這些頂點的鄰接頂點。
2.基本實現思想
(1)頂點v入隊列。
(2)當隊列非空時則繼續執行,不然算法結束。
(3)出隊列取得隊頭頂點v;訪問頂點v並標記頂點v已被訪問。
(4)查找頂點v的第一個鄰接頂點col。
(5)若v的鄰接頂點col未被訪問過的,則col入隊列。
(6)繼續查找頂點v的另外一個新的鄰接頂點col,轉到步驟(5)。
直到頂點v的全部未被訪問過的鄰接點處理完。轉到步驟(2)。
廣度優先遍歷圖是以頂點v爲起始點,由近至遠,依次訪問和v有路徑相通並且路徑長度爲1,2,……的頂點。爲了使「先被訪問頂點的鄰接點」先於「後被訪問頂點的鄰接點」被訪問,需設置隊列存儲訪問的頂點。
3.僞代碼
(1)初始化隊列Q;visited[n]=0;
(2)訪問頂點v;visited[v]=1;頂點v入隊列Q;
(3) while(隊列Q非空)
v=隊列Q的對頭元素出隊;
w=頂點v的第一個鄰接點;
while(w存在)
若是w未訪問,則訪問頂點w;
visited[w]=1;
頂點w入隊列Q;
w=頂點v的下一個鄰接點。
轉自http://www.cnblogs.com/biyeymyhjob/archive/2012/07/18/2596983.html