Lecture 23
Lecture 23
Graph Algorithms
David Luebke 1
11/23/24
Administrative
● Test postponed to Friday
● Homework:
■ Turned in last night by midnight: full credit
■ Turned in tonight by midnight: 1 day late, 10% off
■ Turned in tomorrow night: 2 days late, 30% off
■ Extra credit lateness measured separately
David Luebke 2
11/23/24
Review: Graphs
● A graph G = (V, E)
■ V = set of vertices, E = set of edges
■ Dense graph: |E| |V|2; Sparse graph: |E| |V|
■ Undirected graph:
○ Edge (u,v) = edge (v,u)
○ No self-loops
■ Directed graph:
○ Edge (u,v) goes from vertex u to vertex v, notated uv
■ A weighted graph associates weights with either the
edges or the vertices
David Luebke 3
11/23/24
Review: Representing Graphs
● Assume V = {1, 2, …, n}
● An adjacency matrix represents the graph as a n x n
matrix A:
■ A[i, j] = 1 if edge (i, j) E (or weight of edge)
= 0 if edge (i, j) E
■ Storage requirements: O(V2)
○ A dense representation
■ But, can be very efficient for small graphs
○ Especially if store just one bit/edge
○ Undirected graph: only need one diagonal of matrix
David Luebke 4
11/23/24
Review: Graph Searching
● Given: a graph G = (V, E), directed or undirected
● Goal: methodically explore every vertex and
every edge
● Ultimately: build a tree on the graph
■ Pick a vertex as the root
■ Choose certain edges to produce a tree
■ Note: might also build a forest if graph is not
connected
David Luebke 5
11/23/24
Review: Breadth-First Search
● “Explore” a graph, turning it into a tree
■ One vertex at a time
■ Expand frontier of explored vertices across the
breadth of the frontier
● Builds a tree over the graph
■ Pick a source vertex to be the root
■ Find (“discover”) its children, then their children,
etc.
David Luebke 6
11/23/24
Review: Breadth-First Search
● Again will associate vertex “colors” to guide the
algorithm
■ White vertices have not been discovered
○ All vertices start out white
■ Grey vertices are discovered but not fully explored
○ They may be adjacent to white vertices
■ Black vertices are discovered and fully explored
○ They are adjacent only to black and gray vertices
David Luebke 7
11/23/24
Review: Breadth-First Search
BFS(G, s) {
initialize vertices;
Q = {s}; // Q is a queue (duh); initialize to s
while (Q not empty) {
u = RemoveTop(Q);
for each v u->adj {
if (v->color == WHITE)
v->color = GREY;
v->d = u->d + 1;
v->p = u; What does v->d represent?
Enqueue(Q, v);
What does v->p represent?
}
u->color = BLACK;
}
}
David Luebke 8
11/23/24
Breadth-First Search: Example
r s t u
v w x y
David Luebke 9
11/23/24
Breadth-First Search: Example
r s t u
0
v w x y
Q: s
David Luebke 10
11/23/24
Breadth-First Search: Example
r s t u
1 0
1
v w x y
Q: w r
David Luebke 11
11/23/24
Breadth-First Search: Example
r s t u
1 0 2
1 2
v w x y
Q: r t x
David Luebke 12
11/23/24
Breadth-First Search: Example
r s t u
1 0 2
2 1 2
v w x y
Q: t x v
David Luebke 13
11/23/24
Breadth-First Search: Example
r s t u
1 0 2 3
2 1 2
v w x y
Q: x v u
David Luebke 14
11/23/24
Breadth-First Search: Example
r s t u
1 0 2 3
2 1 2 3
v w x y
Q: v u y
David Luebke 15
11/23/24
Breadth-First Search: Example
r s t u
1 0 2 3
2 1 2 3
v w x y
Q: u y
David Luebke 16
11/23/24
Breadth-First Search: Example
r s t u
1 0 2 3
2 1 2 3
v w x y
Q: y
David Luebke 17
11/23/24
Breadth-First Search: Example
r s t u
1 0 2 3
2 1 2 3
v w x y
Q: Ø
David Luebke 18
11/23/24
BFS: The Code Again
BFS(G, s) {
initialize vertices; Touch every vertex: O(V)
Q = {s};
while (Q not empty) {
u = RemoveTop(Q);
for each v u->adj { u = every vertex, but only once
if (v->color == WHITE) (Why?)
v->color = GREY;
So v = every vertexv->d = u->d + 1;
that appears in v->p = u;
some other vert’s Enqueue(Q, v);
adjacency }list
u->color = BLACK;
} What will be the running time?
}
Total running time: O(V+E)
David Luebke 19
11/23/24
BFS: The Code Again
BFS(G, s) {
initialize vertices;
Q = {s};
while (Q not empty) {
u = RemoveTop(Q);
for each v u->adj {
if (v->color == WHITE)
v->color = GREY;
v->d = u->d + 1;
v->p = u;
Enqueue(Q, v);
}
u->color = BLACK; What will be the storage cost
} in addition to storing the graph?
}
Total space used:
O(max(degree(v))) = O(E)
David Luebke 20
11/23/24
Breadth-First Search: Properties
● BFS calculates the shortest-path distance to the
source node
■ Shortest-path distance (s,v) = minimum number of
edges from s to v, or if v not reachable from s
■ Proof given in the book (p. 472-5)
● BFS builds breadth-first tree, in which paths to
root represent shortest paths in G
■ Thus can use BFS to calculate shortest path from
one vertex to another in O(V+E) time
David Luebke 21
11/23/24
Depth-First Search
● Depth-first search is another strategy for
exploring a graph
■ Explore “deeper” in the graph whenever possible
■ Edges are explored out of the most recently
discovered vertex v that still has unexplored edges
■ When all of v’s edges have been explored,
backtrack to the vertex from which v was
discovered
David Luebke 22
11/23/24
Depth-First Search
● Vertices initially colored white
● Then colored gray when discovered
● Then black when finished
David Luebke 23
11/23/24
Depth-First Search: The Code
DFS(G) DFS_Visit(u)
{ {
u->color = GREY;
for each vertex u G->V
time = time+1;
{
u->d = time;
u->color = WHITE;
for each v u->Adj[]
}
{
time = 0;
if (v->color == WHITE)
for each vertex u G->V
DFS_Visit(v);
{
}
if (u->color == WHITE)
u->color = BLACK;
DFS_Visit(u);
time = time+1;
}
u->f = time;
}
}
David Luebke 24
11/23/24
Depth-First Search: The Code
DFS(G) DFS_Visit(u)
{ {
u->color = GREY;
for each vertex u G->V
time = time+1;
{
u->d = time;
u->color = WHITE;
for each v u->Adj[]
}
{
time = 0;
if (v->color == WHITE)
for each vertex u G->V
DFS_Visit(v);
{
}
if (u->color == WHITE)
u->color = BLACK;
DFS_Visit(u);
time = time+1;
}
u->f = time;
}
}
David Luebke 32
11/23/24
DFS Example
source
vertex
David Luebke 33
11/23/24
DFS Example
source
vertex
d f
1 | | |
| |
| | |
David Luebke 34
11/23/24
DFS Example
source
vertex
d f
1 | | |
2 | |
| | |
David Luebke 35
11/23/24
DFS Example
source
vertex
d f
1 | | |
2 | |
3 | | |
David Luebke 36
11/23/24
DFS Example
source
vertex
d f
1 | | |
2 | |
3 | 4 | |
David Luebke 37
11/23/24
DFS Example
source
vertex
d f
1 | | |
2 | |
3 | 4 5 | |
David Luebke 38
11/23/24
DFS Example
source
vertex
d f
1 | | |
2 | |
3 | 4 5 | 6 |
David Luebke 39
11/23/24
DFS Example
source
vertex
d f
1 | 8 | |
2 | 7 |
3 | 4 5 | 6 |
David Luebke 40
11/23/24
DFS Example
source
vertex
d f
1 | 8 | |
2 | 7 |
3 | 4 5 | 6 |
David Luebke 41
11/23/24
DFS Example
source
vertex
d f
1 | 8 | |
2 | 7 9 |
3 | 4 5 | 6 |
2 | 7 9 |10
3 | 4 5 | 6 |
David Luebke 43
11/23/24
DFS Example
source
vertex
d f
1 | 8 |11 |
2 | 7 9 |10
3 | 4 5 | 6 |
David Luebke 44
11/23/24
DFS Example
source
vertex
d f
1 |12 8 |11 |
2 | 7 9 |10
3 | 4 5 | 6 |
David Luebke 45
11/23/24
DFS Example
source
vertex
d f
1 |12 8 |11 13|
2 | 7 9 |10
3 | 4 5 | 6 |
David Luebke 46
11/23/24
DFS Example
source
vertex
d f
1 |12 8 |11 13|
2 | 7 9 |10
3 | 4 5 | 6 14|
David Luebke 47
11/23/24
DFS Example
source
vertex
d f
1 |12 8 |11 13|
2 | 7 9 |10
3 | 4 5 | 6 14|15
David Luebke 48
11/23/24
DFS Example
source
vertex
d f
1 |12 8 |11 13|16
2 | 7 9 |10
3 | 4 5 | 6 14|15
David Luebke 49
11/23/24
DFS: Kinds of edges
● DFS introduces an important distinction
among edges in the original graph:
■ Tree edge: encounter new (white) vertex
○ The tree edges form a spanning forest
○ Can tree edges form cycles? Why or why not?
David Luebke 50
11/23/24
DFS Example
source
vertex
d f
1 |12 8 |11 13|16
2 | 7 9 |10
3 | 4 5 | 6 14|15
Tree edges
David Luebke 51
11/23/24
DFS: Kinds of edges
● DFS introduces an important distinction
among edges in the original graph:
■ Tree edge: encounter new (white) vertex
■ Back edge: from descendent to ancestor
○ Encounter a grey vertex (grey to grey)
David Luebke 52
11/23/24
DFS Example
source
vertex
d f
1 |12 8 |11 13|16
2 | 7 9 |10
3 | 4 5 | 6 14|15
David Luebke 54
11/23/24
DFS Example
source
vertex
d f
1 |12 8 |11 13|16
2 | 7 9 |10
3 | 4 5 | 6 14|15
David Luebke 56
11/23/24
DFS Example
source
vertex
d f
1 |12 8 |11 13|16
2 | 7 9 |10
3 | 4 5 | 6 14|15
David Luebke 58
11/23/24
DFS: Kinds Of Edges
● Thm 23.9: If G is undirected, a DFS produces
only tree and back edges
● Proof by contradiction:
source
■ Assume there’s a forward edge F?
○ But F? edge must actually be a
back edge (why?)
David Luebke 59
11/23/24
DFS: Kinds Of Edges
● Thm 23.9: If G is undirected, a DFS produces only
tree and back edges
● Proof by contradiction:
source
■ Assume there’s a cross edge
○ But C? edge cannot be cross:
○ must be explored from one of the
vertices it connects, becoming a tree
vertex, before other vertex is explored
○ So in fact the picture is wrong…both
lower tree edges cannot in fact be
tree edges
C?
David Luebke 60
11/23/24
DFS And Graph Cycles
● Thm: An undirected graph is acyclic iff a DFS
yields no back edges
■ If acyclic, no back edges (because a back edge implies a
cycle
■ If no back edges, acyclic
○ No back edges implies only tree edges (Why?)
○ Only tree edges implies we have a tree or a forest
○ Which by definition is acyclic
David Luebke 61
11/23/24
DFS And Cycles
● How would you modify the code to detect cycles?
DFS(G) DFS_Visit(u)
{ {
for each vertex u G->V u->color = GREY;
time = time+1;
{
u->d = time;
u->color = WHITE;
for each v u->Adj[]
}
{
time = 0;
if (v->color == WHITE)
for each vertex u G->V
DFS_Visit(v);
{
}
if (u->color == WHITE)
u->color = BLACK;
DFS_Visit(u);
time = time+1;
}
u->f = time;
}
}
David Luebke 62
11/23/24
DFS And Cycles
● What will be the running time?
DFS(G) DFS_Visit(u)
{ {
for each vertex u G->V u->color = GREY;
time = time+1;
{
u->d = time;
u->color = WHITE;
for each v u->Adj[]
}
{
time = 0;
if (v->color == WHITE)
for each vertex u G->V
DFS_Visit(v);
{
}
if (u->color == WHITE)
u->color = BLACK;
DFS_Visit(u);
time = time+1;
}
u->f = time;
}
}
David Luebke 63
11/23/24
DFS And Cycles
● What will be the running time?
● A: O(V+E)
● We can actually determine if cycles exist in
O(V) time:
■ In an undirected acyclic forest, |E| |V| - 1
■ So count the edges: if ever see |V| distinct edges,
must have seen a back edge along the way
David Luebke 64
11/23/24