深度優先搜尋

2021-09-30 12:10:27 字數 1498 閱讀 3013

深度優先搜尋

1.深度優先搜尋先輩子圖

gπ=(v,eπ),其中

eπ=2.加蓋時間戳

每個頂點v有兩個時間戳,當頂點v第一次被發現時(置為灰色),記錄第乙個時間戳d[v];當頂點第二次被發現時,置第二個時間戳f[v]

(灰色的都是棧裡邊的)

3.對|v|中頂點的每乙個,都對應乙個發現事件和完成事件,每乙個頂點u都有d[u]d[v]則(u,v)就是一條交叉邊

8.在對乙個無向圖g進行深度優先搜尋時,g的一條邊要麼是樹邊,要麼是反向邊

(不可能出現正向邊和交叉邊)(想想為什麼)

所以在無向圖的的深度優先搜尋中先發現(白色)的為樹邊

後發現的(灰色)為反向邊。另外,不可能發現黑色的點,想想為什麼

9.課後習題22.3-6

dfs(g)

for each vertex u in v

color[u]=white

pi[u]=nil

time=0

for each vertex u in v

if color[u]=white

dfs-vist(u)

dfs-visit(u)

color[u]=gray

time++

d[u]=time

push(u)

while stack not empty

u=top()

isleaf=true

for each v int adj[u]

if color[v]=white

color[v]=gray

pi[v]=u

time++

d[v]=time

push(v)

isleaf=false

break;

if isleaf=true

color[u]=black

time++

f[u]=time

pop()

10.課後題22.3-7和22.3-8的反例

11.課後題22.3-9

dfs(g)

for each vertex u 屬於 v[g]

do color[u]=white

pi[u]=nil

timeß0

for each vertex u 屬於v[g]

do if color[u]=white

then dfs-visit(u)

dfs-visit(u)

color[u]=gray

d[u]ßtimeßtime+1

for each vertex v 屬於 adj[u]

do if(color[u]=gray)

if directed(g) or v!=pi[u]

then print(u,v)"is a back-edge"

else if directed(g) and color[v]=black

then if d[u]

分類: 演算法導論筆記

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

前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...

廣度優先搜尋,深度優先搜尋

深度優先搜尋 depth first search 簡稱dfs。最直觀的例子就是 走迷宮 廣度優先搜尋 每個頂點都要進出一遍佇列,每個邊也都會被訪問一次,所以 時間複雜度o v e 主要消耗記憶體的是visited prev陣列 queue佇列,所以 空間複雜度o v 深度優先搜尋 每條邊最多會被訪...

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

深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 package com.neusoft.data.structure 深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 public class dfsbfs 初始化 邊 mmatrix new int vlen vlen for...