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就是對於某乙...