一、深度優先遍歷
深度優先搜尋,是圖論中的經典演算法。其利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。
遞迴定義
圖的深度優先遍歷類似於樹的前序遍歷。採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋。這種搜尋方法稱為深度優先搜尋。相應地,用此方法遍歷圖就很自然地稱之為圖的深度優先遍歷。
實現
深度優先搜尋一般借助遞迴實現。
#includeusing namespace std;
#define n 6
int a[n][n];
bool visited[n];
int adj(int x);
void dfs(int v);
void store_graph() //鄰接矩陣儲存圖
void dfs_graph() //深度遍歷圖
void dfs(int v) //深度遍歷頂點
}int adj(int x) //求鄰接點
int main()
二、廣度優先遍歷
廣度優先遍歷是連通圖的一種遍歷策略。因為它的思想是從乙個頂點v開始,優先遍歷其周圍較廣的區域。很像對樹的層次遍歷。
1、從圖中某個頂點v出發,並訪問此頂點;
2、從v出發,訪問v的各個未曾訪問的鄰接點w1,w2,…,wk;然後,依次從w1,w2,…,wk出發訪問各自未被訪問的鄰接點;
3、重複步驟2,直到全部頂點都被訪問為止。
實現
廣度優先搜尋一般借助乙個佇列實現。
#include#includeusing namespace std;
#define n 6
int a[n][n];
bool visited[n];
void bfs(int v);
int adj(int x);
void store_graph()
void bfs_graph()
void bfs(int v)
adj = adj(temp);
} }}int adj(int x)
int main()
DFS和BFS演算法
本質區別 bfs 的重點在於佇列,而 dfs 的重點在於遞迴。這是它們的本質區別。dfs 演算法 是一種利用遞迴 實質上是用棧來儲存未訪問的結點,先進後出 實現的搜尋演算法,直到找到解或走不下去為止。簡單來說,其搜尋過程和 不撞南牆不回頭 樹的先序遍歷 類似。bfs演算法 是一種利用佇列 用佇列來儲...
演算法強化 BFS和DFS
演算法過程 1.首先將根節點放入佇列中 2.從佇列中取出第乙個節點,進行訪問,並將其所有未訪問過的鄰居加入佇列彙總 3.若隊列為空,則演算法結束 時間複雜度 不確定,v 代表節點數量,e 代表邊的數量 鄰接表表示時,查詢所有頂點的鄰接點所需時間為o e 訪問頂點的鄰接點所花時間為o v 總的時間複雜...
演算法 dfs和bfs的演算法實現
bfs主要應用於連通圖的遍歷,它的核心思想是從乙個頂點開始,輻射狀地優先遍歷其周圍較廣的區域,即逐層遍歷,bfs最經典的應用場景為最短路徑,很多最短路徑演算法都是基於bfs實現,bfs通常基於佇列的思想實現,其實現過程如下 1 頂點入佇列 2 隊列為空,演算法結束,佇列非空,演算法繼續執行 3 出佇...