Graph Lecture 1
Graph Lecture 1
Searching
S
BFS and DFS
Not
u x discovered
Discovered,
adjacent
v y white nodes
Discovered,
no adjacent
w z white nodes
Breadth-First Search (BFS)
u x
BFS(G, u):
1. Initialize the graph
v y color[u] gray
π[u] Nil
d[u] 0
for each other
w z vertex
color[u] white
Breadth-First Search (BFS)
u x Q
BFS(G, u):
2. Initialize the queue
v y QØ
Enqueue(Q, u)
w z
Breadth-First Search (BFS)
t=u
u x Q
BFS(G, u):
3. While Q ≠ Ø
v y 1) t Dequeue(Q)
w z
Breadth-First Search (BFS)
t=u
u Q r = x, v
x
BFS(G, u):
3. While Q ≠ Ø
v y 2) for each r adj to t
if color[r] = white
color[r] gray
π[r] t
w z d[r] d[t] + 1
Enqueue(Q, r)
Breadth-First Search (BFS)
t=u
u Q r = x, v
x
BFS(G, u):
3. While Q ≠ Ø
v y 3) color[t] black
w z
Breadth-First Search (BFS)
t=v
u x Q
BFS(G, u):
3. While Q ≠ Ø
v y 1) t Dequeue(Q)
2) for each r adj to t
…
3) color[t] black
w z
Breadth-First Search (BFS)
t=v
u Q r=y
x
BFS(G, u):
3. While Q ≠ Ø
v y 1) t Dequeue(Q)
2) for each r adj to t
…
3) color[t] black
w z
Breadth-First Search (BFS)
t=v
u Q r=y
x
BFS(G, u):
3. While Q ≠ Ø
v y 1) t Dequeue(Q)
2) for each r adj to t
…
3) color[t] black
w z
Breadth-First Search (BFS)
t=x
u Q r=
x
BFS(G, u):
3. While Q ≠ Ø
v y 1) t Dequeue(Q)
2) for each r adj to t
…
3) color[t] black
w z
Breadth-First Search (BFS)
t=y
u Q r=w
x
BFS(G, u):
3. While Q ≠ Ø
v y 1) t Dequeue(Q)
2) for each r adj to t
…
3) color[t] black
w z
Breadth-First Search (BFS)
t=w
u Q r=z
x
BFS(G, u):
3. While Q ≠ Ø
v y 1) t Dequeue(Q)
2) for each r adj to t
…
3) color[t] black
w z
Breadth-First Search (BFS)
t=z
u Q r=
x
BFS(G, u):
3. While Q ≠ Ø
v y 1) t Dequeue(Q)
2) for each r adj to t
…
3) color[t] black
w z
Breadth-First Search (BFS)
u x BFS(G, u):
- the shortest-path
distance
v y from u
w z
Breadth-First Search (BFS)
u x BFS(G, u):
- the shortest-path
distance
v y from u
- construct a tree
w z
Breadth-First Search (BFS)
u x BFS(G, u):
- Initialization: |V|
- Enqueuing/dequeuing:
v y |V|
- Scanning adj vertices: |E|
w z
Breadth-First Search (BFS)
u x BFS(G, u):
- Initialization: O(|V|)
- Enqueuing/dequeuing:
v y O(|V|)
- Scanning adjacent
vertices:
O(|E|)
w z => total running time:
O(|V| + |E|)
BFS Algorithm
v w
Depth-First Search (DFS)
timestamp: t
d[u]: when u is discovered
f[u]: when searching adj of u
d[u] = t u is finished
v w
Depth-First Search (DFS)
timestamp: t+1
d[u]: when u is discovered
f[u]: when searching adj of u
d[u] = t u is finished
v w
d[v] = t+1
Depth-First Search (DFS)
timestamp: t+2
d[u]: when u is discovered
f[u]: when searching adj of u
d[u] = t u is finished
v w
d[v] = t+1
f[v] = t+2
Depth-First Search (DFS)
timestamp: t+3
d[u]: when u is discovered
f[u]: when searching adj of u
d[u] = t u is finished
v w
d[v] = t+1 d[w] = t+3
f[v] = t+2
Depth-First Search (DFS)
timestamp: t+4
d[u]: when u is discovered
f[u]: when searching adj of u
d[u] = t u is finished
v w
d[v] = t+1 d[w] = t+3
f[v] = t+2 f[v] = t+4
Depth-First Search (DFS)
timestamp: t+5
d[u]: when u is discovered
f[u]: when searching adj of u
d[u] = t u is finished
f[u] = t+5
v w
d[v] = t+1 d[w] = t+3
f[v] = t+2 f[w] = t+4
Depth-First Search (DFS)
Not
u x discovered
Discovered,
adjacent
v y white nodes
Discovered,
no adjacent
w z white nodes
Depth-First Search (DFS)
Not
u x discovered
Discovered,
adjacent
v y white nodes
Discovered,
no adjacent
w z white nodes
Depth-First Search (DFS)
u x DFS(G):
1. Initialization
for each u V[G],
color[u] white
v y
π[u] Nil
time 0
w z
Depth-First Search (DFS)
u x DFS(G):
1. Initialization
2. For each u V[G]
if color[u] = white
v y
DFS-Visit(u)
DFS-Visit(u):
1. Initial Setting
w z color[u] gray
d[u] time time + 1
Depth-First Search (DFS)
u x DFS(G):
1. Initialization
2. For each u V[G]
if color[u] = white
v y
DFS-Visit(u)
DFS-Visit(u):
1. Initial Setting
w z 2. for each adj v of white
π[v] u
DFS-Visit[v]
Depth-First Search (DFS)
u x DFS(G):
1. Initialization
2. For each u V[G]
if color[u] = white
v y
DFS-Visit(u)
DFS-Visit(u):
1. Initial Setting
w z 2. for each adj v of white
π[v] u
DFS-Visit[v]
Depth-First Search (DFS)
u x DFS(G):
1. Initialization
2. For each u V[G]
if color[u] = white
v y
DFS-Visit(u)
DFS-Visit(u):
1. Initial Setting
w z 2. for each adj v of white
π[v] u
DFS-Visit[v]
Depth-First Search (DFS)
u x DFS(G):
1. Initialization
2. For each u V[G]
if color[u] = white
v y
DFS-Visit(u)
DFS-Visit(u):
1. Initial Setting
w z 2. Handling adj vertices
3. color[u] black
f[u] time time + 1
Depth-First Search (DFS)
u x DFS(G):
1. Initialization
2. For each u V[G]
if color[u] = white
v y
DFS-Visit(u)
DFS-Visit(u):
1. Initial Setting
w z 2. Handling adj vertices
3. color[u] black
f[u] time time + 1
Depth-First Search (DFS)
u x DFS(G):
1. Initialization
2. For each u V[G]
if color[u] = white
v y
DFS-Visit(u)
DFS-Visit(u):
1. Initial Setting
w z 2. Handling adj vertices
3. color[u] black
f[u] time time + 1
Depth-First Search (DFS)
u x DFS(G):
1. Initialization
2. For each u V[G]
if color[u] = white
v y
DFS-Visit(u)
DFS-Visit(u):
1. Initial Setting
w z 2. Handling adj vertices
3. color[u] black
f[u] time time + 1
Depth-First Search (DFS)
u x DFS(G):
1. Initialization
2. For each u V[G]
if color[u] = white
v y
DFS-Visit(u)
DFS-Visit(u):
1. Initial Setting
w z 2. Handling adj vertices
3. color[u] black
f[u] time time + 1
Depth-First Search (DFS)
u x DFS(G):
1. Initialization
2. For each u V[G]
if color[u] = white
v y
DFS-Visit(u)
DFS-Visit(u):
1. Initial Setting
w z 2. Handling adj vertices
3. color[u] black
f[u] time time + 1
Depth-First Search (DFS)
u x DFS(G):
1. Initialization
2. For each u V[G]
if color[u] = white
v y
DFS-Visit(u)
DFS-Visit(u):
1. Initial Setting
w z 2. Handling adj vertices
3. color[u] black
f[u] time time + 1
Depth-First Search (DFS)
u x DFS(G):
1. Initialization
2. For each u V[G]
if color[u] = white
v y
DFS-Visit(u)
DFS-Visit(u):
1. Initial Setting
w z 2. Handling adj vertices
3. color[u] black
f[u] time time + 1
Depth-First Search (DFS)
u x DFS(G):
- construct a forest
v y
w z
Depth-First Search (DFS)
u x DFS(G):
- Initialization: O(|V|)
- Traversing vertices: O(|V|)
v y - Scanning adjacent
vertices:
O(|E|)
=> total running time:
w z O(|V| + |E|)
Algorithm