深度和廣度優先搜尋

2021-10-02 06:26:28 字數 1836 閱讀 2135

v:頂點個數,e:邊的個數

時間複雜度

空間複雜度

回溯思想,深度遞迴演算法

時間複雜度:o(e), 每條邊最多訪問兩次

空間複雜度:o(v)

//無向圖

class

graph

的節點`

, id: i,

//當前節點下標})

}}// 無向圖一條邊存兩次,s, t為座標

addedge

(s, t)

}//頂點個數

var v =

8//測試資料:圖

var graph =

newgraph

(v)graph.

addedge(0

,1)graph.

addedge(0

,3)graph.

addedge(1

,2)graph.

addedge(1

,4)graph.

addedge(2

,5)graph.

addedge(3

,4)graph.

addedge(4

,5)graph.

addedge(4

,6)graph.

addedge(5

,7)graph.

addedge(6

,7)//廣度優先演算法

//s,t為下標

function

bfs(s, t)

//待訪問頂點的佇列

const queue =

[graph.adj[s]

]//搜尋路徑的陣列

const prev =

newarray

(v).

fill(-

1)while

(queue.length)

= queue.

shift()

for(

let v of edges)

visited[v]

=true

queue.

push

(graph.adj[v])}

}}}//路徑列印函式

function

print

(prev, s, t1)

//記錄路徑,最後乙個不記錄箭頭

if(t1 == t)

else}}

bfs(0,

7)//0 -> 1 -> 2 -> 5 -> 7

bfs(1,

5)//1 -> 2 -> 5

bfs(6,

2)//6 -> 4 -> 1 -> 2

//深度優先演算法

function

dfs(s, t)

const prev =

newarray

(v).

fill(-

1)helper

(s, t)

print

(prev, s, t)

function

helper

(w, t)

let= graph.adj[w]

for(

let v of edges)}}

}dfs(2

,5)//2 -> 1 -> 0 -> 3 -> 4 -> 5

dfs(5,

2)//5 -> 2

dfs(1,

7)//1 -> 0 -> 3 -> 4 -> 5 -> 7

dfs(0,

7)//0 -> 1 -> 2 -> 5 -> 4 -> 6 -> 7

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

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

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

dbf深度優先搜尋,最經典的方法,可以使用遞迴來實現。結構體定義 typedef char vertextype typedef int edgetype define maxvex 100 define infinite 65535 typedef struct mgraph 測試函式如下 mgr...

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

定義 圖 graph 是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為 g v,e 其中,g表示乙個圖,v是圖g中頂點的集合,e是圖g中邊的集合.簡單點的說 圖由節點和邊組成。乙個節點可能與眾多節點直接相連,這些節點被稱為鄰居。如二叉樹就為乙個簡單的圖 廣度優先搜尋演算法 breadth f...