深度遍歷就是在圖中從乙個頂點開始,按照乙個規則不重複地走下去。就是不撞南牆不回頭一樣。假如從a頂點開始,按照乙個規則去走(假如我們按照一直字典順序走)那麼就從a走到b再從b走到了c,走到c後再按照字典順序的時候,發現a已經走過,那麼此時就退回到c點,選擇另乙個d走下去。就和樹的前序遍歷是一樣的。
1、遞迴實現(通過鄰接矩陣來實現)
void dfs(mgrap g. int i)}}
void dfs(mgrap g,int v)
} }
} }
類似於樹的層次搜尋,主要是從圖中的某個頂點出發,在訪問此頂點後,依次訪問未被訪問的鄰接頂點。
以a為開始節點,依次遍歷b,c,再從b相鄰的結點dfe開始遍歷,最後遍歷的結果就是:abcdfeghi(遵循先進先出規則)
1、採用佇列的方式
void bfs(mgrap g)
initqueue(&q);
for(i=0; iif(!visited[i])}}}}}
兩者的不同點是,bfs遍歷的時候,按照深度去遍歷,需要回退,所以需要用棧來記錄原來頂點的位置;dfs是從相鄰的結點開始依次遍歷,所以先遍歷到誰就先輸出誰,所以採用佇列的方式去實現。 BFS和DFS演算法學習總結
bfs 這是一種基於佇列這種資料結構的搜尋方式,它的特點是由每乙個狀態可以擴充套件出許多狀態,然後再以此擴充套件,直到找到目標狀態或者佇列中頭尾指標相遇,即佇列中所有狀態都已處理完畢。廣度優先搜尋 bfs 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。...
dfs和bfs的總結
dfs dfs演算法是乙個對連通圖進行遍歷的演算法。它的思想是從乙個被選定的點出發一條路走到底,如果得不到目的解,那就返回到上乙個節點,然後換一條路繼續走到底,直到找到目的解返回或者全部遍歷完返回乙個事先定好的值。dfs一般借用遞迴完成整個演算法的構造。dfs演算法的一般框架經我總結大致為下 int...
DFS和BFS的總結
如果我們使用 dfs bfs 只是為了遍歷一棵樹 一張圖上的所有結點的話,那麼 dfs 和 bfs 的能力沒什麼差別,我們當然更傾向於更方便寫 空間複雜度更低的 dfs 遍歷。不過,某些使用場景是 dfs 做不到的,只能使用 bfs 遍歷。這就是本文要介紹的兩個場景 層序遍歷 最短路徑 還有寫 df...