深度搜尋和廣度搜尋

2021-07-28 19:16:17 字數 1978 閱讀 7831

這篇部落格很早之前就寫好了,但是一直沒有發出來。。。。。。

在進行詳細解說之前,我們需要先借用圖的概念,圖就是由一些小圓點(稱為頂點)和連線這些小圓點的直線(稱為邊)組成的。如下圖是由5個頂點(

1,2,3,4,5)和5

條邊(1-2,1-2,1-4,2-5,3-4

)組成的。

現在我們從一號頂點開始遍歷這個圖,使用深度優先搜尋來遍歷這個圖將會得到如下的結果:

深度優先遍歷的主要思想是:首先以乙個未訪問過的頂點作為起始頂點,沿當前頂點的邊走到未訪問過的頂點;當沒有未訪問過的頂點時,則回到上乙個頂點,繼續試探訪問別的訪問,知道所有的頂點都被訪問過。顯然,深度優先搜尋的遍歷先沿著圖的某一條分支遍歷直到末端,然後回溯,再沿著另一條進行同樣的遍歷,直到所有的頂點都被訪問過為止。

在用深度優先搜尋時,最常使用的方法是用乙個二維陣列e來儲存。二維陣列中的第i行第j列表示的就是頂點i到頂點j是否有邊,1表示有邊,∞表示沒有邊。這裡我們將自己到自己設為0(即i=j),我們將這種儲存的方法稱為圖的鄰接矩陣儲存法。

廣度優先遍歷的主要思想就是:首先以乙個未被訪問過得頂點作為起始頂點,訪問其所有的相鄰的頂點,然後對每個相鄰的頂點,再訪問他們相鄰的未被訪問過的頂點,直到所有的頂點都被訪問過,遍歷結束。廣度優先遍歷往往是要用到佇列這個概念的。

深度優先搜尋和廣度優先搜尋的區別:

例1:小哼和小哈一同坐飛機去旅遊,他們現在位於1號城市,目標是5號城市,可是1號城市並沒有5號城市的直航。不過小哼已經收集了很多航班的資訊,吸納子啊小哼希望找到一種乘坐方式,使得轉機的次數最少,該如何解決?(題目**於:阿哈雷寫的《啊哈,演算法!》)

下面分別用兩種方式來解決這個問題:

深度優先搜尋:

#includeint e[100][100];

int book[100];

int min = 9999999;

int end; //結束的站點

int n;//n個城市

void dfs(int cur,int sum)

if(cur == end)

return;

}for(i = 0; i < n; i++)

}}int main()

else

} }//初始化陣列

//獲取兩個站點之間的航線

for(i = 0; i < m; i++)

book[start] = 1;

dfs(start,0);

printf("min = %d\n",min);

}

結果:

法二:廣度優先搜尋

#includestruct queue

;int main()

else

} }

for(i = 1; i <= m; i++)

que[tail].n = start;

que[tail].sum = 0;

tail++;

book[start] = 1;

while(head < tail)

if(que[tail-1].sum == end)

} if(flag == 1)

head++;

}printf("min = %d",que[tail-1].sum);

}

結果:

以上:我也不知道自己寫了些啥?最近效率有點低。。。。。。。

廣度搜尋和深度搜尋

我現在要從 雙子峰 前往 金門大橋 求最短的路徑 帶單獨參構造方法 public placetree string p 帶全參的構造方法 public placetree placetree left,placetree right,string p public static void main ...

搜尋 深度搜尋 廣度搜尋

迷宮 題目描述 一天extense在森林裡探險的時候不小心走入了乙個迷宮,迷宮可以看成是由n n的格點組成,每個格點只有2種狀態,和 前者表示可以通行後者表示不能通行。同時當extense處在某個格點時,他只能移動到東南西北 或者說上下左右 四個方向之一的相鄰格點上,extense想要從點a走到點b...

深度優先搜尋和廣度優先搜尋

深度優先的思想是先記住當前的起點,然後選定乙個方向一條道走到黑,若失敗則回到起點再選定另外乙個方向走到黑。廣度優先的思想是記住當前的起點,然後選定各個方向的相鄰點作為新的起點,再繼續。可以看出,深度優先和廣度優先都需要記住當前的起點,不同的是深度優先每次只需要記住乙個方向的相鄰點,廣度優先則要記住所...