Graphs
CSE 332 – Section 6
Slides by James Richie Sulaeman
Graphs
A graph is a set of vertices connected by edges
Graphs
A
D
B
E
F
C
vertices
edges
example of a undirected,
unweighted, cyclic graph
Graph Terminology
Graph Terminology (continue)
B
C
A
B
C
A
B
C
A
directed, weighted, cyclic graph
directed, unweighted, acyclic graph
undirected, unweighted, acyclic graph
B
C
A
undirected, weighted, cyclic graph
5
3
7
1
3
5
7
Graph Traversals
Graph Traversals
Depth First Search (DFS)
Breadth First Search (BFS)
How do we iterate through a graph?
(not recommend)
Depth First Search
DFS(Graph g, Vertex curr):
mark curr as visited
for (v : neighbors(current)):
if (!v marked “visited”)
DFS(g, v)
mark curr as “done”;
Depth First Search (DFS)
(not recommend)
Breadth First Search
BFS(Vertex start):
initialize queue q to hold start
mark start as visited
while q is not empty:
vertex v = q.dequeue()
for each neighbour u of v:
if u is not visited:
mark u as visited
predecessor[u] = v
add u to q
Breadth First Search (BFS)
Problem 0
BFS(Vertex start):
initialize queue q to hold start
mark start as visited
while q is not empty:
vertex v = q.dequeue()
for each neighbour u of v:
if u is not visited:
mark u as visited
predecessor[u] = v
add u to q
Problem 0 (1)
|
|
|
|
|
S
T
Z
X
Y
Queue:
front
back
S |
S
Vertex | Predecessor | Visited? |
S | – | No |
T | – | No |
X | – | No |
Y | – | No |
Z | – | No |
Yes |
|
|
|
|
|
S
T
Z
X
Y
Queue:
front
back
T |
S
Y
T
S
Vertex | Predecessor | Visited? |
S | – | Yes |
T | – | No |
X | – | No |
Y | – | No |
Z | – | No |
Y |
Yes |
S |
S |
Yes |
Problem 0 (2)
Y |
|
|
|
|
S
T
Z
X
Y
Queue:
front
back
(ignore Y since already visited)
S
Y
T
Z
X
Vertex | Predecessor | Visited? |
S | – | Yes |
T | S | Yes |
X | – | No |
Y | S | Yes |
Z | – | No |
Yes |
X |
T
Yes |
T |
T |
Z |
Problem 0 (3)
X |
Z |
|
|
|
S
T
Z
X
Y
Queue:
front
back
(nothing happens since all already visited)
S
Y
T
Z
X
Y
Vertex | Predecessor | Visited? |
S | – | Yes |
T | S | Yes |
X | T | Yes |
Y | S | Yes |
Z | T | Yes |
Problem 0 (4)
Z |
|
|
|
|
S
T
Z
X
Y
Queue:
front
back
(nothing happens since all already visited)
S
Y
T
Z
X
Vertex | Predecessor | Visited? |
S | – | Yes |
T | S | Yes |
X | T | Yes |
Y | S | Yes |
Z | T | Yes |
X
Problem 0 (5)
|
|
|
|
|
S
T
Z
X
Y
Queue:
front
back
(nothing happens since all already visited)
S
Y
T
Z
X
Vertex | Predecessor | Visited? |
S | – | Yes |
T | S | Yes |
X | T | Yes |
Y | S | Yes |
Z | T | Yes |
Z
Problem 0 (6)
|
|
|
|
|
S
T
Z
X
Y
Queue:
front
back
S
Y
T
Z
X
Vertex | Predecessor | Visited? |
S | – | Yes |
T | S | Yes |
X | T | Yes |
Y | S | Yes |
Z | T | Yes |
Problem 0 (7)
BFS Table Interpretation
Vertex | Predecessor | Visited? |
S | – | Yes |
T | S | Yes |
X | T | Yes |
Y | S | Yes |
Z | T | Yes |
BFS Table Interpretation
How to find a path from the start node to a target node?
How to check if a path exists from the start node to a target node?
Problem 1
DFS(Graph g, Vertex curr):
mark curr as visited
for (v : neighbors(current)):
if (!v marked “visited”)
DFS(g, v)
mark curr as “done”;
Problem 1 (1)
S
T
Z
X
Y
StackFrame (curr):
Vertex | Visited? | Done? |
S | No | No |
T | No | No |
X | No | No |
Y | No | No |
Z | No | No |
Yes |
S |
S
|
S
T
Z
X
Y
StackFrame (curr):
Vertex | Visited? | Done? |
S | Yes | No |
T | No | No |
X | No | No |
Y | No | No |
Z | No | No |
S |
T |
S
Yes |
T
Problem 1 (2)
|
S
T
Z
X
Y
StackFrame (curr):
Vertex | Visited? | Done? |
S | Yes | No |
T | Yes | No |
X | No | No |
Y | No | No |
Z | No | No |
S |
T |
Yes |
X |
T
X
Problem 1 (3)
|
S
T
Z
X
Y
StackFrame (curr):
Vertex | Visited? | Done? |
S | Yes | No |
T | Yes | No |
X | Yes | No |
Y | No | No |
Z | No | No |
S |
T |
X |
Yes |
X |
Problem 1 (4)
|
S
T
Z
X
Y
StackFrame (curr):
Vertex | Visited? | Done? |
S | Yes | No |
T | Yes | No |
X | Yes | Yes |
Y | No | No |
Z | No | No |
S |
T |
Yes |
X |
Y |
T
Y
Problem 1 (5)
|
S
T
Z
X
Y
StackFrame (curr):
Vertex | Visited? | Done? |
S | Yes | No |
T | Yes | No |
X | Yes | Yes |
Y | Yes | No |
Z | No | No |
S |
T |
Yes |
X |
Y |
Y
Z |
Z
Problem 1 (6)
|
S
T
Z
X
Y
StackFrame (curr):
Vertex | Visited? | Done? |
S | Yes | No |
T | Yes | No |
X | Yes | Yes |
Y | Yes | No |
Z | Yes | No |
S |
T |
Yes |
X |
Y |
Z |
Z |
Problem 1 (7)
|
S
T
Z
X
Y
StackFrame (curr):
Vertex | Visited? | Done? |
S | Yes | No |
T | Yes | No |
X | Yes | Yes |
Y | Yes | No |
Z | Yes | Yes |
S |
T |
Yes |
X |
Y |
Z |
Y |
Problem 1 (8)
|
S
T
Z
X
Y
StackFrame (curr):
Vertex | Visited? | Done? |
S | Yes | No |
T | Yes | No |
X | Yes | Yes |
Y | Yes | Yes |
Z | Yes | Yes |
S |
T |
Yes |
X |
Y |
Z |
T |
Problem 1 (9)
|
S
T
Z
X
Y
StackFrame (curr):
Vertex | Visited? | Done? |
S | Yes | No |
T | Yes | Yes |
X | Yes | Yes |
Y | Yes | Yes |
Z | Yes | Yes |
S |
T |
Yes |
X |
Y |
Z |
S |
Problem 1 (10)
BFS/DFS Useful Properties
BFS - Shortest Path
DFS - Cycle Detection
Start from A
Detect Cycle Examples
A
E
B
D
C
Vertex: B
Vertex: B
Mark B as visited
Vertex: A
Vertex: A
Mark A as visited
A
E
B
D
C
Start from A
No Cycle Example
__ - Visited
__ - Done
A
B
Vertex: B
Mark B as done
B
C
Vertex: C
Mark C as visited
D
Vertex: D
Mark D as visited
E
Vertex: E
Mark E as visited
E
Vertex: E
Mark E as done
D
Vertex: D
Mark D as done
C
Vertex: C
Mark C as done
A
Vertex: A
Mark A as done
A
D
E
C
B
Start from A
Vertex: A
Vertex: B
Vertex: C
Mark C as visited
Vertex: D
Mark D as visited
Vertex: B
Mark B as visited
Vertex: C
Mark C as visited
Vertex: D
Mark as done
Edge points to a visited node, back edge detected!
Vertex: A
Mark A as visited
Vertex: E
Mark E as visited
Vertex: B
Go to next unvisited
With Cycle Example
A
B
C
D
D
E
Vertex: C
Mark C as done
C
B
Vertex: E
Mark E as done
E
A
Vertex: A
Mark A as done
Vertex: B
Mark B as done
Problem 2: Detecting Cycles
Problem 2 (0)
S
X
Y
Z
U
Vertex | Visited? | Done? | Cycles Detected at Vertex |
S | No | No | None |
U | No | No | None |
X | No | No | None |
Y | No | No | None |
Z | No | No | None |
Yes |
S
StackFrame (curr):
S |
U
Problem 2 (1)
S
X
Y
Z
U
StackFrame (curr):
S
S |
U |
Vertex | Visited? | Done? | Cycles Detected at Vertex |
S | Yes | No | None |
U | No | No | None |
X | No | No | None |
Y | No | No | None |
Z | No | No | None |
Yes |
U
Problem 2 (2)
S
X
Y
Z
StackFrame (curr):
S
S |
U |
Vertex | Visited? | Done? | Cycles Detected at Vertex |
S | Yes | No | None |
U | Yes | No | None |
X | No | No | None |
Y | No | No | None |
Z | No | No | None |
Yes |
U |
U
Problem 2 (3)
S
X
Y
Z
X
StackFrame (curr):
S
S |
U |
Vertex | Visited? | Done? | Cycles Detected at Vertex |
S | Yes | No | None |
U | Yes | Yes | None |
X | No | No | None |
Y | No | No | None |
Z | No | No | None |
Yes |
U |
X |
U
Problem 2 (4)
S
X
Y
Z
Y
StackFrame (curr):
S
S |
U |
Vertex | Visited? | Done? | Cycles Detected at Vertex |
S | Yes | No | None |
U | Yes | Yes | None |
X | Yes | No | None |
Y | No | No | None |
Z | No | No | None |
Yes |
U |
X |
Y |
(X,Y) |
U
Problem 2 (5)
S
X
Y
Z
StackFrame (curr):
S
S |
U |
Vertex | Visited? | Done? | Cycles Detected at Vertex |
S | Yes | No | None |
U | Yes | Yes | None |
X | Yes | No | None |
Y | Yes | No | (X,Y) |
Z | No | No | None |
Yes |
U |
X |
Y |
Z
(S,X,Y,Z), (X,Y,Z) |
Z |
U
Problem 2 (6)
S
X
Y
Z
StackFrame (curr):
S
S |
U |
Vertex | Visited? | Done? | Cycles Detected at Vertex |
S | Yes | No | None |
U | Yes | Yes | None |
X | Yes | No | None |
Y | Yes | No | (X,Y) |
Z | Yes | No | (S,X,Y,Z), (X,Y,Z) |
Yes |
X |
Y |
Z |
Z |
U
Problem 2 (7)
S
X
Y
Z
StackFrame (curr):
S
S |
U |
Vertex | Visited? | Done? | Cycles Detected at Vertex |
S | Yes | No | None |
U | Yes | Yes | None |
X | Yes | No | None |
Y | Yes | No | (X,Y) |
Z | Yes | Yes | (S,X,Y,Z), (X,Y,Z) |
X |
Y |
Z |
Y |
Yes |
U
Problem 2 (8)
S
X
Y
Z
StackFrame (curr):
S
S |
U |
Vertex | Visited? | Done? | Cycles Detected at Vertex |
S | Yes | No | None |
U | Yes | Yes | None |
X | Yes | No | None |
Y | Yes | Yes | (X,Y) |
Z | Yes | Yes | (S,X,Y,Z), (X,Y,Z) |
X |
Y |
Z |
X |
Yes |
U
S
X
Y
Z
StackFrame (curr):
S
S |
U |
Vertex | Visited? | Done? | Cycles Detected at Vertex |
S | Yes | No | None |
U | Yes | Yes | None |
X | Yes | Yes | None |
Y | Yes | Yes | (X,Y) |
Z | Yes | Yes | (S,X,Y,Z), (X,Y,Z) |
X |
Y |
Z |
S |
Yes |
Problem 2 (9)
Dijkstra’s Algorithm
(Shortest Path)
Dijkstra(Vertex source):
for each vertex v:
set v.cost = infinity
mark v as unvisited
set source.cost = 0
while exist unvisited vertices:
select unvisited vertex v with lowest cost
mark v as visited
for each edge (v, u) with weight w:
if u is not visited:
potentialBest = v.cost + w // cost of best path to u through v
currBest = u.cost // cost of current best path to u
if (potentialBest < currBest):
u.cost = potentialBest
u.pred = v
Dijkstra’s Algorithm
Dijkstra’s algorithm finds the minimum-cost path from a source vertex to every other vertex in a non-negatively weighted graph
Problem 3
Dijkstra(Vertex source):
for each vertex v:
set v.cost = infinity
mark v as unvisited
set source.cost = 0
while exist unvisited vertices:
select unvisited vertex v with lowest cost
mark v as visited
for each edge (v, u) with weight w:
if u is not visited:
potentialBest = v.cost + w
currBest = u.cost
if (potentialBest < currBest):
u.cost = potentialBest
u.pred = v
Problem 3 (1)
Vertex | Visited? | Cost | Predecessor |
A | | | – |
B | | | – |
C | | | – |
D | | | – |
E | | | – |
F | | | – |
F
A
D
C
B
E
1
3
5
2
8
16
13
13
50
6
3
7
∞ |
∞ |
∞ |
∞ |
∞ |
∞ |
0 |
No |
No |
No |
No |
No |
No |
F
A
D
C
B
E
1
3
5
2
8
16
13
13
50
6
3
7
A
1
8
16
13
50
Vertex | Visited? | Cost | Predecessor |
A | No | 0 | – |
B | No | ∞ | – |
C | No | ∞ | – |
D | No | ∞ | – |
E | No | ∞ | – |
F | No | ∞ | – |
Yes |
∞ 8 |
∞ 16 |
∞ 50 |
∞ 13 |
∞ 1 |
A |
A |
A |
A |
A |
Problem 3 (2)
F
A
D
C
B
E
1
3
5
2
8
16
13
13
50
6
3
7
3
13
Vertex | Visited? | Cost | Predecessor |
A | Yes | 0 | – |
B | No | ∞ 8 | A |
C | No | ∞ 16 | A |
D | No | ∞ 50 | A |
E | No | ∞ 13 | A |
F | No | ∞ 1 | A |
Yes |
A
F
∞ 13 4 |
A F |
Problem 3 (3)
F
A
D
C
B
E
1
3
5
2
8
16
13
13
50
6
3
7
5
Vertex | Visited? | Cost | Predecessor |
A | Yes | 0 | – |
B | No | ∞ 8 | A |
C | No | ∞ 16 | A |
D | No | ∞ 50 | A |
E | No | ∞ 13 4 | A F |
F | Yes | ∞ 1 | A |
E
∞ 50 9 |
Yes |
A
F
A E |
Problem 3 (4)
F
A
D
C
B
E
1
3
5
2
8
16
13
13
50
6
3
7
Vertex | Visited? | Cost | Predecessor |
A | Yes | 0 | – |
B | No | ∞ 8 | A |
C | No | ∞ 16 | A |
D | No | ∞ 50 9 | A E |
E | Yes | ∞ 13 4 | A F |
F | Yes | ∞ 1 | A |
B
Yes |
A
F
E
Problem 3 (5)
F
A
D
C
B
E
1
3
5
2
8
16
13
13
50
6
3
7
2
Vertex | Visited? | Cost | Predecessor |
A | Yes | 0 | – |
B | Yes | ∞ 8 | A |
C | No | ∞ 16 | A |
D | No | ∞ 50 9 | A E |
E | Yes | ∞ 13 4 | A F |
F | Yes | ∞ 1 | A |
D
Yes |
A D |
A
(ignore D→B since B is already visited)
F
E
B
∞ 16 11 |
6
Problem 3 (6)
F
A
D
C
B
E
1
3
5
2
8
16
13
13
50
6
3
7
7
Vertex | Visited? | Cost | Predecessor |
A | Yes | 0 | – |
B | Yes | ∞ 8 | A |
C | No | ∞ 16 11 | A D |
D | Yes | ∞ 50 9 | A E |
E | Yes | ∞ 13 4 | A F |
F | Yes | ∞ 1 | A |
C
Yes |
A
(ignore C→B & C→E since B & E are already visited)
F
E
B
D
3
Problem 3 (7)
F
A
D
C
B
E
1
3
5
2
8
16
13
13
50
6
3
7
Vertex | Visited? | Cost | Predecessor |
A | Yes | 0 | – |
B | Yes | ∞ 8 | A |
C | No | ∞ 16 11 | A D |
D | Yes | ∞ 50 9 | A E |
E | Yes | ∞ 13 4 | A F |
F | Yes | ∞ 1 | A |
Yes |
A
F
E
B
D
C
Problem 3 (8)
Problem 4
Dijkstra(Vertex source):
for each vertex v:
set v.cost = infinity
mark v as unvisited
set source.cost = 0
while exist unvisited vertices:
select unvisited vertex v with lowest cost
mark v as visited
for each edge (v, u) with weight w:
if u is not visited:
potentialBest = v.cost + w
currBest = u.cost
if (potentialBest < currBest):
u.cost = potentialBest
u.pred = v
Problem 4 (1)
Vertex | Visited? | Cost | Predecessor |
A | | | – |
B | | | – |
C | | | – |
D | | | – |
E | | | – |
F | | | – |
B
A
D
E
F
C
5
3
-5
10
4
60
70
80
90
6
7
∞ |
∞ |
∞ |
∞ |
∞ |
∞ |
0 |
No |
No |
No |
No |
No |
No |
B
A
D
E
F
C
5
3
-5
10
4
60
70
80
90
6
7
Vertex | Visited? | Cost of Path | Pred |
a | True | 0 | |
b | True | ∞ 05 | a |
c | True | ∞ 80 08 | a b |
d | True | ∞ 90 03 | a c |
e | True | ∞ 60 13 | a d |
f | True | ∞ 04 | a |
Order added to known set: a, f, b, c, d, e |
Problem 4 (2)
Thank You!