dbf深度優先搜尋,最經典的方法,可以使用遞迴來實現。
結構體定義
typedef char vertextype;
typedef int edgetype;
#define maxvex 100
#define infinite 65535
typedef struct
mgraph;
測試函式如下
mgraph graph;
graph.numvertexes = 9;
graph.numedges = 14;
graph.vexs[0] = 'a';
graph.vexs[1] = 'b';
graph.vexs[2] = 'c';
graph.vexs[3] = 'd';
graph.vexs[4] = 'e';
graph.vexs[5] = 'f';
graph.vexs[6] = 'g';
graph.vexs[7] = 'h';
graph.vexs[8] = 'i';
for (int i = 0;i用遞迴實現的**如下
int visited[maxvex];
void dfs(mgraph graph, int i)
{ printf("%c ",graph.vexs[i]);
visited[i]=1;
for (int j = 0;j同樣也可以使用棧來實現
void deepthfirstsearch_stack(mgraph graph)
{ for (int i = 0;istackdfs;
for (int i = 0; i而廣度優先搜尋可以使用佇列來實現
void breadthfirstsearch(mgraph graph)
{ for (int i = 0;iqueuebfs;
for (int i = 0;i執行結果如下圖
可以看到,二者**幾乎一毛一樣。區別在於dfs使用了棧,bfs使用的是佇列。其實結合dfs和bfs的特點也很好理解,從樹的角度思考,bfs希望先找到左右的子節點,希望按照這個順序來列印,所以就是先進先出,也就是佇列。而dfs則希望先順著某條線一直列印,希望後進的先列印出來,也就是棧。
注意,兩種dfs列印結果是不一樣的,但是都是dfs。
最後需要注意的是,用棧和佇列寫這兩個演算法時,列印的位置很重要,自己寫容易出錯,不知道是在visit[i]=1的時候就列印還是出佇列的時候列印。其實很簡單,我們利用的就是棧和佇列的特色,所以出棧和出佇列的時候列印就沒有問題了。
深度優先搜尋和廣度優先搜尋
深度優先的思想是先記住當前的起點,然後選定乙個方向一條道走到黑,若失敗則回到起點再選定另外乙個方向走到黑。廣度優先的思想是記住當前的起點,然後選定各個方向的相鄰點作為新的起點,再繼續。可以看出,深度優先和廣度優先都需要記住當前的起點,不同的是深度優先每次只需要記住乙個方向的相鄰點,廣度優先則要記住所...
深度優先搜尋和廣度優先搜尋
定義 圖 graph 是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為 g v,e 其中,g表示乙個圖,v是圖g中頂點的集合,e是圖g中邊的集合.簡單點的說 圖由節點和邊組成。乙個節點可能與眾多節點直接相連,這些節點被稱為鄰居。如二叉樹就為乙個簡單的圖 廣度優先搜尋演算法 breadth f...
深度優先搜尋和廣度優先搜尋
深度優先搜尋 可以用這個圖來很好的幫助我們理解dfs,dfs是一種列舉所有完整路徑來遍歷所有情況的搜尋方法,可以使用遞迴來很好的實現dfs,遞迴式可以理解為 解決的典型問題給定乙個序列,列舉這個序列的所有子串行,從中選擇乙個某方面最優的子串行。也可以簡化理解為列舉從n個整數中選擇k個數的所有方案 具...