深搜和廣搜

2021-10-01 22:07:55 字數 1889 閱讀 5260

qq 親密度用的是帶權圖中,每條邊都有乙個(weight),我們可以通過這個權重來表示 qq 好友間的親密度。

鄰接矩陣儲存方法

對於無向圖來說,如果頂點 i 與頂點 j 之間有邊,我們就將 a[i][j]和 a[j][i]標記為 1;對於有向圖來說,如果頂點 i 到頂點 j 之間,有一條箭頭從頂點 i 指向頂點 j 的邊,那我們就將 a[i][j]標記為 1。同理,如果有一條箭頭從頂點 j 指向頂點 i 的邊,我們就將 a[j][i]標記為 1。對於帶權圖,陣列中就儲存相應的權重。

鄰接表儲存方法

每個頂點對應一條鍊錶,鍊錶中儲存的是與這個頂點相連線的其他頂點。

為了提高查詢效率,可以將鍊錶換成紅黑樹,跳表、雜湊表等

圖上的搜尋演算法,最直接的理解就是,在圖中找出從乙個頂點出發,到另乙個頂點的路徑。具體方法有很多,最「暴力」的深度優先、廣度優先搜尋,還有 a*、ida* 等啟發式搜尋演算法。

廣度優先搜尋(bfs)

public

void

bfs(

int s,

int t)

while

(queue.

size()

!=0) visited[q]

=true

; queue.

add(q);}

}}}private

void

print

(int

prev,

int s,

int t)

system.out.

print

(t +

" ")

;}

visited 是用來記錄已經被訪問的頂點,用來避免頂點被重複訪問。如果頂點 q 被訪問,那相應的 visited[q]會被設定為 true。

queue 是乙個佇列,用來儲存已經被訪問、但相連的頂點還沒有被訪問的頂點。因為廣度優先搜尋是逐層訪問的,也就是說,我們只有把第 k 層的頂點都訪問完成之後,才能訪問第 k+1 層的頂點。當我們訪問到第 k 層的頂點的時候,我們需要把第 k 層的頂點記錄下來,稍後才能通過第 k 層的頂點來找第 k+1 層的頂點。所以,我們用這個佇列來實現記錄的功能。

prev 用來記錄搜尋路徑。當我們從頂點 s 開始,廣度優先搜尋到頂點 t 後,prev 陣列中儲存的就是搜尋的路徑。不過,這個路徑是反向儲存的。prev[w]儲存的是,頂點 w 是從哪個前驅頂點遍歷過來的。比如,我們通過頂點 2 的鄰接表訪問到頂點 3,那 prev[3]就等於 2。

深度優先搜尋(dfs)

boolean found =

false

;// 全域性變數或者類成員變數

public

void

dfs(

int s,

int t)

recurdfs

(s, t, visited, prev)

;print

(prev, s, t);}

private

void

recurdfs

(int w,

int t, boolean[

] visited,

int[

] prev)

for(

int i =

0; i < adj[w]

.size()

;++i)

}}

廣搜和深搜

一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數 已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著若是...

深搜和廣搜

深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次 採用的搜尋方法的特點是盡可能先對縱深方向進行搜尋。基本思路 深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依...

廣搜和深搜

深度優先搜尋 dfs,運用遞迴函式,通過棧的結構進行搜尋。模板 dfs 狀態 if 狀態 是 目標狀態then dosomething else for 每個新狀態 if 新狀態合法 dfs 新狀態 主程式 dfs 初始狀態 廣度優先搜尋 bfs,運用遞迴函式,通過佇列的方式搜尋。dfs就是對於某乙...