SlideShare a Scribd company logo
Design and Analysis of Algorithms
Course Instructor
Dr. Md. Mosaddek Khan
Associate Professor
Dept. of Computer Science and Engineering
Email: mosaddek.khan@northsouth.edu
Recommended Textbook
• Cormen, T.H., Leiserson, C.E., Rivest, R.L. and Stein, C., 2022.
Introduction to algorithms. MIT press.
Time complexity
• Amount of time needed for the algorithm to
finish
• Best case
• Average case
• Worst case
• Not actual time: related to size of input.
• Big O notation
Graph
• Graph is probably the data structure that has
the closest resemblance to our daily life.
• There are many types of graphs describing
the relationships in real life.
Graph Variations
• Variations:
– A connected graph has a path from every vertex to
every other
– In an undirected graph:
• Edge (u,v) = edge (v,u)
• No self-loops
– In a directed graph:
• Edge (u,v) goes from vertex u to vertex v, notated uv
Graph Variations
Graph Variations
• More variations:
– A weighted graph associates weights with either the edges
or the vertices
• E.g., a road map: edges might be weighted w/ distance
– A multigraph allows multiple edges between the same
vertices
• E.g., the call graph in a program (a function can get called from
multiple points in another function)
Graph - Definition
• A graph G=(V, E) consists a set of vertices, V, and a set of edges,
E.
• Each edge is a pair of (v, w), where v, w belongs to V
• If the pair is unordered, the graph is undirected; otherwise it is
directed
{c,f}
{a,c}
{a,b}
{b,d} {c,d}
{e,f}
{b,e}
An undirected graph
Definition
• Path: the sequence of vertices to go through from one vertex to
another.
– a path from A to C is [A, B, C], or [A, G, B, C], or [A, E, F, D, B, C].
• Path Length: the number of edges in a path.
• Cycle: a path where the starting point and endpoint are the same
vertex.
– [A, B, D, F, E] forms a cycle. Similarly, [A, G, B] forms another cycle.
Definition
• Degree of a Vertex: the term “degree” applies to unweighted graphs. The
degree of a vertex is the number of edges connecting the vertex.
– the degree of vertex A is 3 because three edges are connecting it.
• In-Degree: “in-degree” is a concept in directed graphs. If the in-degree of a
vertex is d, there are d directional edges incident to the vertex.
– In Figure 2, A’s indegree is 1, i.e., the edge from F to A.
• Out-Degree: “out-degree” is a concept in directed graphs. If the out-degree of a
vertex is d, there are d edges incident from the vertex.
– A’s outdegree is 3, i,e, the edges A to B, A to C, and A to G.
Definition
• Connectivity: if there exists at least one path between
two vertices, these two vertices are connected.
– A and C are connected because there is at least one path
connecting them.
• Negative Weight Cycle: In a “weighted graph”, if the sum
of the weights of all edges of a cycle is a negative value, it
is a negative weight cycle.
– In the Figure the sum of weights is -3.
Definition
• Complete Graph
– a complete graph is a simple undirected graph in which
every pair of distinct vertices is connected by a unique
edge.
– A complete digraph is a directed graph in which every pair
of distinct vertices is connected by a pair of unique edges
(one in each direction).
– How many edges are there in an N-vertex complete graph?
Definition
• Bipartite Graph
• a bipartite graph (or bigraph) is a graph whose vertices can
be divided into two disjoint and independent sets
Definition
• We will typically express running times in
terms of |E| and |V| (often dropping the |’s)
– If |E|  |V|2
the graph is dense
– If |E|  |V| the graph is sparse
• If you know you are dealing with dense or
sparse graphs, different data structures may
make sense
Graph Representation
• Two popular computer representations of a
graph. Both represent the vertex set and the
edge set, but in different ways.
1. Adjacency Matrix
Use a 2D matrix to represent the graph
2. Adjacency List
Use a 1D array of linked lists
Adjacency Matrix
• l
Adjacency List
• If the graph is not dense, in other words, sparse, a better
solution is an adjacency list
Adjacency Matrix Example
2
4
3
5
1
7
6
9
8
0 0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 1 0
1 0 0 1 1 0 0 0 1 0 1
2 0 1 0 0 1 0 0 0 1 0
3 0 1 0 0 1 1 0 0 0 0
4 0 0 1 1 0 0 0 0 0 0
5 0 0 0 1 0 0 1 0 0 0
6 0 0 0 0 0 1 0 1 0 0
7 0 1 0 0 0 0 1 0 0 0
8 1 0 1 0 0 0 0 0 0 1
9 0 1 0 0 0 0 0 0 1 0
Adjacency List Example
2
4
3
5
1
7
6
9
8
0 0
1
2
3
4
5
6
7
8
9
2 3 7 9
8
1 4 8
1 4 5
2 3
3 6
5 7
1 6
0 2 9
1 8
Adjacency List vs. Matrix
• Adjacency List
– More compact than adjacency matrices if graph has few
edges
– Requires more time to find if an edge exists
• Adjacency Matrix
– Always require n2
space
• This can waste a lot of space if the number of edges are
sparse
– Can quickly find if an edge exists
Graph Traversal
• Application example
– Given a graph representation and a vertex s in the
graph
– Find paths from s to other vertices
• Two common graph traversal algorithms
• Breadth-First Search (BFS)
– Find the shortest paths in an unweighted graph
• Depth-First Search (DFS)
– Topological sort
– Find strongly connected components
BFS and Shortest Path Problem
• Given any source vertex s, BFS visits the other vertices at
increasing distances away from s. In doing so, BFS discovers
paths from s to other vertices
• What do we mean by “distance”? The number of edges on a
path from s
2
4
3
5
1
7
6
9
8
0
Consider s=vertex 1
Nodes at distance 1?
2, 3, 7, 9
1
1
1
1
2
2
2
2
s
Example
Nodes at distance 2?
8, 6, 5, 4
Nodes at distance 3?
0
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
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.
Breadth-First Search
• Every vertex of a graph contains a color at every
moment:
– White vertices have not been discovered
• All vertices start with white initially
– 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
• Explore vertices by scanning adjacency list of grey
vertices
Breadth-First Search: The Code
Data: color[V], prev[V],d[V]
BFS(G) // starts from here
{
for each vertex u  V-
{s}
{
color[u]=WHITE;
prev[u]=NIL;
d[u]=inf;
}
color[s]=GRAY;
d[s]=0; prev[s]=NIL;
Q=empty;
ENQUEUE(Q,s);
While(Q not empty)
{
u = DEQUEUE(Q);
for each v  adj[u]{
if (color[v] == WHITE){
color[v] = GREY;
d[v] = d[u] + 1;
prev[v] = u;
Enqueue(Q, v);
}
}
color[u] = BLACK;
}
}
Breadth-First Search: Example








r s t u
v w x y
Vertex r s t u v w x y
color W W W W W W W W
d        
prev nil nil nil nil nil nil nil nil
Breadth-First Search: Example


0





r s t u
v w x y
s
Q:
vertex r s t u v w x y
Color W G W W W W W W
d  0      
prev nil nil nil nil nil nil nil nil
Breadth-First Search: Example
1

0
1




r s t u
v w x y
w r
s
Q:
vertex r s t u v w x y
Color G B W W W G W W
d 1 0    1  
prev s nil nil nil nil s nil nil
Breadth-First Search: Example
1

0
1
2
2


r s t u
v w x y
t x
w r
s
Q:
vertex r s t u V w X y
Color G B G W W B G W
d 1 0 2   1 2 
prev s nil w nil nil s w nil
Breadth-First Search: Example
1
2
0
1
2
2


r s t u
v w x y
v
t x
w r
s
Q:
vertex r s t u v w x y
Color B B G W G B G W
d 1 0 2  2 1 2 
prev s nil w nil r s w nil
Breadth-First Search: Example
1
2
0
1
2
2
3

r s t u
v w x y
u
v
t x
w r
s
Q:
vertex r s t u v w x y
Color B B B G G B G W
d 1 0 2 3 2 1 2 
prev s nil w t r s w nil
Breadth-First Search: Example
1
2
0
1
2
2
3
3
r s t u
v w x y
y
u
v
t x
w r
s
Q:
vertex r s t u v w x y
Color B B B G G B B G
d 1 0 2 3 2 1 2 3
prev s nil w t r s w x
Breadth-First Search: Example
1
2
0
1
2
2
3
3
r s t u
v w x y
y
u
v
t x
w r
s
Q:
vertex r s t u v w x y
Color B B B G B B B G
d 1 0 2 3 2 1 2 3
prev s nil w t r s w x
Breadth-First Search: Example
1
2
0
1
2
2
3
3
r s t u
v w x y
y
u
v
t x
w r
s
Q:
vertex r s t u v w x y
Color B B B B B B B G
d 1 0 2 3 2 1 2 3
prev s nil w t r s w x
Breadth-First Search: Example
1
2
0
1
2
2
3
3
r s t u
v w x y
y
u
v
t x
w r
s
Q:
vertex r s t u v w x y
Color B B B G B B B B
d 1 0 2 3 2 1 2 3
prev s nil w t r s w x
BFS: The Code (again)
Data: color[V], prev[V],d[V]
BFS(G) // starts from here
{
for each vertex u  V-
{s}
{
color[u]=WHITE;
prev[u]=NIL;
d[u]=inf;
}
color[s]=GRAY;
d[s]=0; prev[s]=NIL;
Q=empty;
ENQUEUE(Q,s);
While(Q not empty)
{
u = DEQUEUE(Q);
for each v  adj[u]{
if (color[v] == WHITE){
color[v] = GREY;
d[v] = d[u] + 1;
prev[v] = u;
Enqueue(Q, v);
}
}
color[u] = BLACK;
}
}
Breadth-First Search: Print Path
Data: color[V], prev[V],d[V]
Print-Path(G, s, v)
{
if(v==s)
print(s)
else if(prev[v]==NIL)
print(No path);
else{
Print-Path(G,s,prev[v]);
print(v);
}
}
BFS: Complexity
Data: color[V], prev[V],d[V]
BFS(G) // starts from here
{
for each vertex u  V-
{s}
{
color[u]=WHITE;
prev[u]=NIL;
d[u]=inf;
}
color[s]=GRAY;
d[s]=0; prev[s]=NIL;
Q=empty;
ENQUEUE(Q,s);
While(Q not empty)
{
u = DEQUEUE(Q);
for each v  adj[u]{
if(color[v] == WHITE){
color[v] = GREY;
d[v] = d[u] + 1;
prev[v] = u;
Enqueue(Q, v);
}
}
color[u] = BLACK;
}
}
O(V)
O(V)
u = every vertex, but only once
(Why?)
What will be the running time?
Total running time: O(V+E)
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
Application of BFS
• Find the shortest path in an
undirected/directed unweighted graph.
• Find the bipartite-ness of a graph.
• Find cycle in a graph.
• Find the connectedness of a graph.
• And many more.
Exercises on BFS
• CLRS – Chapter 22 – elementary Graph
Algorithms
• Exercise you have to solve: (Page 602)
– 22.2-7 (Wrestler)
– 22.2-8 (Diameter)
– 22.2-9 (Traverse)
Depth-First Search
• Input:
– G = (V, E) (No source vertex given!)
• Goal:
– Explore the edges of G to “discover” every vertex in V starting at the most
current visited node
– Search may be repeated from multiple sources
• Output:
– 2 timestamps on each vertex:
• d[v] = discovery time
• f[v] = finishing time (done with examining v’s adjacency list)
– Depth-first forest
1 2
5 4
3
Depth-First Search
• Search “deeper” in the graph whenever possible
• Edges are explored out of the most recently
discovered vertex v that still has unexplored edges
• After all edges of v have been explored, the search “backtracks”
from the parent of v
• The process continues until all vertices reachable from the
original source have been discovered
• If undiscovered vertices remain, choose one of them as a new
source and repeat the search from that vertex
• DFS creates a “depth-first forest”
1 2
5 4
3
DFS Additional Data Structures
• Global variable: time-stamp
– Incremented when nodes are discovered or finished
• color[u] – similar to BFS
– White before discovery, gray while processing and black
when finished processing
• prev[u] – predecessor of u
• d[u], f[u] – discovery and finish times
GRAY
WHITE BLACK
0 2V
d[u] f[u]
1 ≤ d[u] < f [u] ≤ 2 |V|
Depth-First Search: The Code
Data: color[V], time,
prev[V],d[V], f[V]
DFS(G) // where prog starts
{
for each vertex u  V
{
color[u] = WHITE;
prev[u]=NIL;
f[u]=inf;
d[u]=inf;
}
time = 0;
for each vertex u  V
if (color[u] == WHITE)
DFS_Visit(u);
}
DFS_Visit(u)
{
color[u] = GREY;
time = time+1;
d[u] = time;
for each v  Adj[u]
{
if(color[v] == WHITE){
prev[v]=u;
DFS_Visit(v);}
}
color[u] = BLACK;
time = time+1;
f[u] = time;
}
Initialize
Depth-First Search: The Code
Data: color[V], time,
prev[V],d[V], f[V]
DFS(G) // where prog starts
{
for each vertex u  V
{
color[u] = WHITE;
prev[u]=NIL;
f[u]=inf;
d[u]=inf;
}
time = 0;
for each vertex u  V
if (color[u] == WHITE)
DFS_Visit(u);
}
DFS_Visit(u)
{
color[u] = GREY;
time = time+1;
d[u] = time;
for each v  Adj[u]
{
if(color[v] == WHITE){
prev[v]=u;
DFS_Visit(v);}
}
color[u] = BLACK;
time = time+1;
f[u] = time;
}
What does d[u] represent?
Depth-First Search: The Code
Data: color[V], time,
prev[V],d[V], f[V]
DFS(G) // where prog starts
{
for each vertex u  V
{
color[u] = WHITE;
prev[u]=NIL;
f[u]=inf;
d[u]=inf;
}
time = 0;
for each vertex u  V
if (color[u] == WHITE)
DFS_Visit(u);
}
DFS_Visit(u)
{
color[u] = GREY;
time = time+1;
d[u] = time;
for each v  Adj[u]
{
if(color[v] == WHITE){
prev[v]=u;
DFS_Visit(v);}
}
color[u] = BLACK;
time = time+1;
f[u] = time;
}
What does f[u] represent?
Depth-First Search: The Code
Data: color[V], time,
prev[V],d[V], f[V]
DFS(G) // where prog starts
{
for each vertex u  V
{
color[u] = WHITE;
prev[u]=NIL;
f[u]=inf;
d[u]=inf;
}
time = 0;
for each vertex u  V
if (color[u] == WHITE)
DFS_Visit(u);
}
DFS_Visit(u)
{
color[u] = GREY;
time = time+1;
d[u] = time;
for each v  Adj[u]
{
if(color[v] == WHITE){
prev[v]=u;
DFS_Visit(v);
}}
color[u] = BLACK;
time = time+1;
f[u] = time;
}
Will all vertices eventually be colored black?
DFS Example
source
vertex
S
A
B C
D
E
F
G
DFS Example
1 | | |
|
|
|
| |
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 | | |
|
|
|
2 | |
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 | | |
|
|
3 |
2 | |
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 | | |
|
|
3 | 4
2 | |
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 | | |
|
5 |
3 | 4
2 | |
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 | | |
|
5 | 6
3 | 4
2 | |
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 | | |
|
5 | 6
3 | 4
2 | 7 |
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 | 8 | |
|
5 | 6
3 | 4
2 | 7 |
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 | 8 | |
|
5 | 6
3 | 4
2 | 7 9 |
source
vertex
d f
What is the structure of the grey vertices?
What do they represent?
S
A
B C
D
E
F
G
DFS Example
1 | 8 | |
|
5 | 6
3 | 4
2 | 7 9 |10
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 | 8 |11 |
|
5 | 6
3 | 4
2 | 7 9 |10
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 |12 8 |11 |
|
5 | 6
3 | 4
2 | 7 9 |10
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 |12 8 |11 13|
|
5 | 6
3 | 4
2 | 7 9 |10
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 |12 8 |11 13|
14|
5 | 6
3 | 4
2 | 7 9 |10
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 |12 8 |11 13|
14|15
5 | 6
3 | 4
2 | 7 9 |10
source
vertex
d f
S
A
B C
D
E
F
G
DFS Example
1 |12 8 |11 13|16
14|15
5 | 6
3 | 4
2 | 7 9 |10
source
vertex
d f
S
A
B C
D
E
F
G
Depth-First Search: The Code
Data: color[V], time,
prev[V],d[V], f[V]
DFS(G) // where prog starts
{
for each vertex u  V
{
color[u] = WHITE;
prev[u]=NIL;
f[u]=inf;
d[u]=inf;
}
time = 0;
for each vertex u  V
if (color[u] == WHITE)
DFS_Visit(u);
}
DFS_Visit(u)
{
color[u] = GREY;
time = time+1;
d[u] = time;
for each v  Adj[u]
{
if (color[v] == WHITE)
prev[v]=u;
DFS_Visit(v);
}
color[u] = BLACK;
time = time+1;
f[u] = time;
}
What will be the running time?
Depth-First Search: The Code
Data: color[V], time,
prev[V],d[V], f[V]
DFS(G) // where prog starts
{
for each vertex u  V
{
color[u] = WHITE;
prev[u]=NIL;
f[u]=inf;
d[u]=inf;
}
time = 0;
for each vertex u  V
if (color[u] == WHITE)
DFS_Visit(u);
}
DFS_Visit(u)
{
color[u] = GREY;
time = time+1;
d[u] = time;
for each v  Adj[u]
{
if (color[v] == WHITE)
prev[v]=u;
DFS_Visit(v);
}
color[u] = BLACK;
time = time+1;
f[u] = time;
}
Running time: O(V2
) because call DFS_Visit on each vertex,
and the loop over Adj[] can run as many as |V| times
O(V)
O(V)
O(V)
Depth-First Search: The Code
Data: color[V], time,
prev[V],d[V], f[V]
DFS(G) // where prog starts
{
for each vertex u  V
{
color[u] = WHITE;
prev[u]=NIL;
f[u]=inf;
d[u]=inf;
}
time = 0;
for each vertex u  V
if (color[u] == WHITE)
DFS_Visit(u);
}
DFS_Visit(u)
{
color[u] = GREY;
time = time+1;
d[u] = time;
for each v  Adj[u]
{
if (color[v] == WHITE)
prev[v]=u;
DFS_Visit(v);
}
color[u] = BLACK;
time = time+1;
f[u] = time;
}
BUT, there is actually a tighter bound.
How many times will DFS_Visit() actually be called?
Depth-First Search: The Code
Data: color[V], time,
prev[V],d[V], f[V]
DFS(G) // where prog starts
{
for each vertex u  V
{
color[u] = WHITE;
prev[u]=NIL;
f[u]=inf;
d[u]=inf;
}
time = 0;
for each vertex u  V
if (color[u] == WHITE)
DFS_Visit(u);
}
DFS_Visit(u)
{
color[u] = GREY;
time = time+1;
d[u] = time;
for each v  Adj[u]
{
if (color[v] == WHITE)
prev[v]=u;
DFS_Visit(v);
}
color[u] = BLACK;
time = time+1;
f[u] = time;
}
So, running time of DFS = O(V+E)
Depth-First Sort Analysis
• This running time argument is an informal
example of amortized analysis
– “Charge” the exploration of edge to the edge:
• Each loop in DFS_Visit can be attributed to an edge in the
graph
• Runs once per edge if directed graph, twice if undirected
• Thus loop will run in O(E) time, algorithm O(V+E)
– Considered linear for graph, b/c adj list requires O(V+E) storage
– Important to be comfortable with this kind of
reasoning and analysis
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?
– No
DFS Example
1 |12 8 |11 13|16
14|15
5 | 6
3 | 4
2 | 7 9 |10
source
vertex
d f
Tree edges
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)
• Self loops are considered as to be back edge.
DFS Example
1 |12 8 |11 13|16
14|15
5 | 6
3 | 4
2 | 7 9 |10
source
vertex
d f
Tree edges Back edges
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
– Forward edge: from ancestor to descendent
• Not a tree edge, though
• From grey node to black node
DFS Example
1 |12 8 |11 13|16
14|15
5 | 6
3 | 4
2 | 7 9 |10
source
vertex
d f
Tree edges Back edges Forward edges
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
– Forward edge: from ancestor to descendent
– Cross edge: between a tree or subtrees
• From a grey node to a black node
DFS Example
1 |12 8 |11 13|16
14|15
5 | 6
3 | 4
2 | 7 9 |10
source
vertex
d f
Tree edges Back edges Forward edges Cross edges
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
– Forward edge: from ancestor to descendent
– Cross edge: between a tree or subtrees
• Note: tree & back edges are important; most
algorithms don’t distinguish forward & cross
More about the edges
• Let (u,v) is an edge.
– If (color[v] = WHITE) then (u,v) is a tree edge
– If (color[v] = GRAY) then (u,v) is a back edge
– If (color[v] = BLACK) then (u,v) is a forward/cross
edge
• Forward Edge: d[u]<d[v]
• Cross Edge: d[u]>d[v]
Depth-First Search - Timestamps
3/6
7/8
1/10
2/9
12/13
4/5
a b s
d e f
B F
11/16
14/15
c
g
C C
C
C
B
Depth-First Search - Timestamps
a e
s
b f
d
B
F
c
g
C
C
C
C
B
Depth-First Search: Detect Edge
Data: color[V], time,
prev[V],d[V], f[V]
DFS(G) // where prog starts
{
for each vertex u  V
{
color[u] = WHITE;
prev[u]=NIL;
f[u]=inf;
d[u]=inf;
}
time = 0;
for each vertex u  V
if (color[u] == WHITE)
DFS_Visit(u);
}
DFS_Visit(u)
{
color[u] = GREY;
time = time+1;
d[u] = time;
for each v  Adj[u]
{
detect edge type using “color[v]”
if(color[v] == WHITE){
prev[v]=u;
DFS_Visit(v);
}}
color[u] = BLACK;
time = time+1;
f[u] = time;
}
DFS: Kinds Of Edges
• Thm 22.10: If G is undirected, a DFS produces
only tree and back edges
• Proof by contradiction:
– Assume there’s a forward edge
• But F? edge must actually be a
back edge (why?)
source
F?
DFS: Kinds Of Edges
• Thm 22.10: If G is undirected, a DFS produces only
tree and back edges
• Proof by contradiction:
– 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
source
C?
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
• Thus, can run DFS to find whether a graph has a
cycle
DFS And Cycles
Data: color[V], time,
prev[V],d[V], f[V]
DFS(G) // where prog starts
{
for each vertex u  V
{
color[u] = WHITE;
prev[u]=NIL;
f[u]=inf; d[u]=inf;
}
time = 0;
for each vertex u  V
if (color[u] == WHITE)
DFS_Visit(u);
}
DFS_Visit(u)
{
color[u] = GREY;
time = time+1;
d[u] = time;
for each v  Adj[u]
{
if (color[v]==WHITE){
prev[v]=u;
DFS_Visit(v);
}
}
color[u] = BLACK;
time = time+1;
f[u] = time;
}
How would you modify the code to detect
cycles?
DFS And Cycles
Data: color[V], time,
prev[V],d[V], f[V]
DFS(G) // where prog starts
{
for each vertex u  V
{
color[u] = WHITE;
prev[u]=NIL;
f[u]=inf; d[u]=inf;
}
time = 0;
for each vertex u  V
if (color[u] == WHITE)
DFS_Visit(u);
}
DFS_Visit(u)
{
color[u] = GREY;
time = time+1;
d[u] = time;
for each v  Adj[u]
{
if (color[v]==WHITE){
prev[v]=u;
DFS_Visit(v); }
else {cycle exists;}
}
color[u] = BLACK;
time = time+1;
f[u] = time;
}
What will be the running time?
DFS And Cycles
• What will be the running time for undirected
graph to detect cycle?
• A: O(V+E)
• We can actually determine if cycles exist in
O(V) time
– How??
DFS And Cycles
• What will be the running time for undirected
graph to detect cycle?
• 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
DFS And Cycles
• What will be the running time for directed
graph to detect cycle?
• A: O(V+E)
Exercises on DFS
• CLRS Chapter 22 (Elementary Graph
Algorithms)
• Exercise: (Page
– 22.3-5 –Detect edge using d[u], d[v], f[u], f[v]
– 22.3-12 – Connected Component
– 22.3-13 – Singly connected
Some applications of BFS and DFS
• Topological Sort (Topic of Next Lecture)
• Euler Path (Topic of Next Lecture)
• Dictionary Search
• Mathematical Problem
• Grid Traversal
The idea of State/Node
• Parameters describing a scenario
• Useless Parameters
– If value of the parameter change doesn’t affect
the outcome
– If value of the parameter can be derived from
other parameters
• Useful Parameter
– Not useless!!!
Example - States
• Grid Problem, direction change takes time
• Grid Problem, blocks alternating

More Related Content

PPTX
Unit 9 graph
PPTX
Unit ix graph
PDF
LEC 12-DSALGO-GRAPHS(final12).pdf
PPTX
Graph in data structure
PPSX
Unit-6 Graph.ppsx ppt
PPTX
PPT
Breadth first search
PPTX
UNIT II - Graph Algorithms techniques.pptx
Unit 9 graph
Unit ix graph
LEC 12-DSALGO-GRAPHS(final12).pdf
Graph in data structure
Unit-6 Graph.ppsx ppt
Breadth first search
UNIT II - Graph Algorithms techniques.pptx

Similar to Design and analysis of Algorithms Lecture 1 (BFS, DFS).ppsx (20)

PPTX
Graph Theory
PPTX
Graph Representation, DFS and BFS Presentation.pptx
PDF
Graphhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh.pdf
PPTX
Graph Data Structure on social media analysis
PPTX
Unit II_Graph.pptxkgjrekjgiojtoiejhgnltegjte
PPTX
Graph data structures for ppt for understanding.pptx
PDF
U1 L5 DAA.pdf
PPTX
Data Structures - Lecture 10 [Graphs]
PDF
Unit-10 Graphs .pdf
PPT
Data Structures-Non Linear DataStructures-Graphs
PPTX
UNIT IV NON LINEAR DATA STRUCTURES - GRAPH
PPT
Lecture 5b graphs and hashing
PPTX
Graphical reprsentation dsa (DATA STRUCTURE ALGORITHM)
PPTX
ppt 1.pptx
PPTX
graphssssssssssssssssssssssssssssss.pptx
PDF
Unit ii divide and conquer -2
PPT
Graphs in data structures
PPT
Shortest path (Dijkistra's Algorithm) & Spanning Tree (Prim's Algorithm)
PPT
22-graphs1-dfs-bfs.ppt
Graph Theory
Graph Representation, DFS and BFS Presentation.pptx
Graphhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh.pdf
Graph Data Structure on social media analysis
Unit II_Graph.pptxkgjrekjgiojtoiejhgnltegjte
Graph data structures for ppt for understanding.pptx
U1 L5 DAA.pdf
Data Structures - Lecture 10 [Graphs]
Unit-10 Graphs .pdf
Data Structures-Non Linear DataStructures-Graphs
UNIT IV NON LINEAR DATA STRUCTURES - GRAPH
Lecture 5b graphs and hashing
Graphical reprsentation dsa (DATA STRUCTURE ALGORITHM)
ppt 1.pptx
graphssssssssssssssssssssssssssssss.pptx
Unit ii divide and conquer -2
Graphs in data structures
Shortest path (Dijkistra's Algorithm) & Spanning Tree (Prim's Algorithm)
22-graphs1-dfs-bfs.ppt
Ad

Recently uploaded (20)

PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
medical staffing services at VALiNTRY
PPTX
CHAPTER 2 - PM Management and IT Context
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
System and Network Administration Chapter 2
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PPTX
L1 - Introduction to python Backend.pptx
PDF
How Creative Agencies Leverage Project Management Software.pdf
How to Migrate SBCGlobal Email to Yahoo Easily
Adobe Illustrator 28.6 Crack My Vision of Vector Design
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
Which alternative to Crystal Reports is best for small or large businesses.pdf
PTS Company Brochure 2025 (1).pdf.......
medical staffing services at VALiNTRY
CHAPTER 2 - PM Management and IT Context
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Operating system designcfffgfgggggggvggggggggg
Odoo Companies in India – Driving Business Transformation.pdf
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
2025 Textile ERP Trends: SAP, Odoo & Oracle
System and Network Administration Chapter 2
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
wealthsignaloriginal-com-DS-text-... (1).pdf
Design an Analysis of Algorithms I-SECS-1021-03
L1 - Introduction to python Backend.pptx
How Creative Agencies Leverage Project Management Software.pdf
Ad

Design and analysis of Algorithms Lecture 1 (BFS, DFS).ppsx

  • 1. Design and Analysis of Algorithms
  • 2. Course Instructor Dr. Md. Mosaddek Khan Associate Professor Dept. of Computer Science and Engineering Email: mosaddek.khan@northsouth.edu
  • 3. Recommended Textbook • Cormen, T.H., Leiserson, C.E., Rivest, R.L. and Stein, C., 2022. Introduction to algorithms. MIT press.
  • 4. Time complexity • Amount of time needed for the algorithm to finish • Best case • Average case • Worst case • Not actual time: related to size of input. • Big O notation
  • 5. Graph • Graph is probably the data structure that has the closest resemblance to our daily life. • There are many types of graphs describing the relationships in real life.
  • 6. Graph Variations • Variations: – A connected graph has a path from every vertex to every other – In an undirected graph: • Edge (u,v) = edge (v,u) • No self-loops – In a directed graph: • Edge (u,v) goes from vertex u to vertex v, notated uv
  • 8. Graph Variations • More variations: – A weighted graph associates weights with either the edges or the vertices • E.g., a road map: edges might be weighted w/ distance – A multigraph allows multiple edges between the same vertices • E.g., the call graph in a program (a function can get called from multiple points in another function)
  • 9. Graph - Definition • A graph G=(V, E) consists a set of vertices, V, and a set of edges, E. • Each edge is a pair of (v, w), where v, w belongs to V • If the pair is unordered, the graph is undirected; otherwise it is directed {c,f} {a,c} {a,b} {b,d} {c,d} {e,f} {b,e} An undirected graph
  • 10. Definition • Path: the sequence of vertices to go through from one vertex to another. – a path from A to C is [A, B, C], or [A, G, B, C], or [A, E, F, D, B, C]. • Path Length: the number of edges in a path. • Cycle: a path where the starting point and endpoint are the same vertex. – [A, B, D, F, E] forms a cycle. Similarly, [A, G, B] forms another cycle.
  • 11. Definition • Degree of a Vertex: the term “degree” applies to unweighted graphs. The degree of a vertex is the number of edges connecting the vertex. – the degree of vertex A is 3 because three edges are connecting it. • In-Degree: “in-degree” is a concept in directed graphs. If the in-degree of a vertex is d, there are d directional edges incident to the vertex. – In Figure 2, A’s indegree is 1, i.e., the edge from F to A. • Out-Degree: “out-degree” is a concept in directed graphs. If the out-degree of a vertex is d, there are d edges incident from the vertex. – A’s outdegree is 3, i,e, the edges A to B, A to C, and A to G.
  • 12. Definition • Connectivity: if there exists at least one path between two vertices, these two vertices are connected. – A and C are connected because there is at least one path connecting them. • Negative Weight Cycle: In a “weighted graph”, if the sum of the weights of all edges of a cycle is a negative value, it is a negative weight cycle. – In the Figure the sum of weights is -3.
  • 13. Definition • Complete Graph – a complete graph is a simple undirected graph in which every pair of distinct vertices is connected by a unique edge. – A complete digraph is a directed graph in which every pair of distinct vertices is connected by a pair of unique edges (one in each direction). – How many edges are there in an N-vertex complete graph?
  • 14. Definition • Bipartite Graph • a bipartite graph (or bigraph) is a graph whose vertices can be divided into two disjoint and independent sets
  • 15. Definition • We will typically express running times in terms of |E| and |V| (often dropping the |’s) – If |E|  |V|2 the graph is dense – If |E|  |V| the graph is sparse • If you know you are dealing with dense or sparse graphs, different data structures may make sense
  • 16. Graph Representation • Two popular computer representations of a graph. Both represent the vertex set and the edge set, but in different ways. 1. Adjacency Matrix Use a 2D matrix to represent the graph 2. Adjacency List Use a 1D array of linked lists
  • 18. Adjacency List • If the graph is not dense, in other words, sparse, a better solution is an adjacency list
  • 19. Adjacency Matrix Example 2 4 3 5 1 7 6 9 8 0 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 1 2 0 1 0 0 1 0 0 0 1 0 3 0 1 0 0 1 1 0 0 0 0 4 0 0 1 1 0 0 0 0 0 0 5 0 0 0 1 0 0 1 0 0 0 6 0 0 0 0 0 1 0 1 0 0 7 0 1 0 0 0 0 1 0 0 0 8 1 0 1 0 0 0 0 0 0 1 9 0 1 0 0 0 0 0 0 1 0
  • 20. Adjacency List Example 2 4 3 5 1 7 6 9 8 0 0 1 2 3 4 5 6 7 8 9 2 3 7 9 8 1 4 8 1 4 5 2 3 3 6 5 7 1 6 0 2 9 1 8
  • 21. Adjacency List vs. Matrix • Adjacency List – More compact than adjacency matrices if graph has few edges – Requires more time to find if an edge exists • Adjacency Matrix – Always require n2 space • This can waste a lot of space if the number of edges are sparse – Can quickly find if an edge exists
  • 22. Graph Traversal • Application example – Given a graph representation and a vertex s in the graph – Find paths from s to other vertices • Two common graph traversal algorithms • Breadth-First Search (BFS) – Find the shortest paths in an unweighted graph • Depth-First Search (DFS) – Topological sort – Find strongly connected components
  • 23. BFS and Shortest Path Problem • Given any source vertex s, BFS visits the other vertices at increasing distances away from s. In doing so, BFS discovers paths from s to other vertices • What do we mean by “distance”? The number of edges on a path from s 2 4 3 5 1 7 6 9 8 0 Consider s=vertex 1 Nodes at distance 1? 2, 3, 7, 9 1 1 1 1 2 2 2 2 s Example Nodes at distance 2? 8, 6, 5, 4 Nodes at distance 3? 0
  • 24. 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
  • 25. 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.
  • 26. Breadth-First Search • Every vertex of a graph contains a color at every moment: – White vertices have not been discovered • All vertices start with white initially – 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 • Explore vertices by scanning adjacency list of grey vertices
  • 27. Breadth-First Search: The Code Data: color[V], prev[V],d[V] BFS(G) // starts from here { for each vertex u  V- {s} { color[u]=WHITE; prev[u]=NIL; d[u]=inf; } color[s]=GRAY; d[s]=0; prev[s]=NIL; Q=empty; ENQUEUE(Q,s); While(Q not empty) { u = DEQUEUE(Q); for each v  adj[u]{ if (color[v] == WHITE){ color[v] = GREY; d[v] = d[u] + 1; prev[v] = u; Enqueue(Q, v); } } color[u] = BLACK; } }
  • 28. Breadth-First Search: Example         r s t u v w x y Vertex r s t u v w x y color W W W W W W W W d         prev nil nil nil nil nil nil nil nil
  • 29. Breadth-First Search: Example   0      r s t u v w x y s Q: vertex r s t u v w x y Color W G W W W W W W d  0       prev nil nil nil nil nil nil nil nil
  • 30. Breadth-First Search: Example 1  0 1     r s t u v w x y w r s Q: vertex r s t u v w x y Color G B W W W G W W d 1 0    1   prev s nil nil nil nil s nil nil
  • 31. Breadth-First Search: Example 1  0 1 2 2   r s t u v w x y t x w r s Q: vertex r s t u V w X y Color G B G W W B G W d 1 0 2   1 2  prev s nil w nil nil s w nil
  • 32. Breadth-First Search: Example 1 2 0 1 2 2   r s t u v w x y v t x w r s Q: vertex r s t u v w x y Color B B G W G B G W d 1 0 2  2 1 2  prev s nil w nil r s w nil
  • 33. Breadth-First Search: Example 1 2 0 1 2 2 3  r s t u v w x y u v t x w r s Q: vertex r s t u v w x y Color B B B G G B G W d 1 0 2 3 2 1 2  prev s nil w t r s w nil
  • 34. Breadth-First Search: Example 1 2 0 1 2 2 3 3 r s t u v w x y y u v t x w r s Q: vertex r s t u v w x y Color B B B G G B B G d 1 0 2 3 2 1 2 3 prev s nil w t r s w x
  • 35. Breadth-First Search: Example 1 2 0 1 2 2 3 3 r s t u v w x y y u v t x w r s Q: vertex r s t u v w x y Color B B B G B B B G d 1 0 2 3 2 1 2 3 prev s nil w t r s w x
  • 36. Breadth-First Search: Example 1 2 0 1 2 2 3 3 r s t u v w x y y u v t x w r s Q: vertex r s t u v w x y Color B B B B B B B G d 1 0 2 3 2 1 2 3 prev s nil w t r s w x
  • 37. Breadth-First Search: Example 1 2 0 1 2 2 3 3 r s t u v w x y y u v t x w r s Q: vertex r s t u v w x y Color B B B G B B B B d 1 0 2 3 2 1 2 3 prev s nil w t r s w x
  • 38. BFS: The Code (again) Data: color[V], prev[V],d[V] BFS(G) // starts from here { for each vertex u  V- {s} { color[u]=WHITE; prev[u]=NIL; d[u]=inf; } color[s]=GRAY; d[s]=0; prev[s]=NIL; Q=empty; ENQUEUE(Q,s); While(Q not empty) { u = DEQUEUE(Q); for each v  adj[u]{ if (color[v] == WHITE){ color[v] = GREY; d[v] = d[u] + 1; prev[v] = u; Enqueue(Q, v); } } color[u] = BLACK; } }
  • 39. Breadth-First Search: Print Path Data: color[V], prev[V],d[V] Print-Path(G, s, v) { if(v==s) print(s) else if(prev[v]==NIL) print(No path); else{ Print-Path(G,s,prev[v]); print(v); } }
  • 40. BFS: Complexity Data: color[V], prev[V],d[V] BFS(G) // starts from here { for each vertex u  V- {s} { color[u]=WHITE; prev[u]=NIL; d[u]=inf; } color[s]=GRAY; d[s]=0; prev[s]=NIL; Q=empty; ENQUEUE(Q,s); While(Q not empty) { u = DEQUEUE(Q); for each v  adj[u]{ if(color[v] == WHITE){ color[v] = GREY; d[v] = d[u] + 1; prev[v] = u; Enqueue(Q, v); } } color[u] = BLACK; } } O(V) O(V) u = every vertex, but only once (Why?) What will be the running time? Total running time: O(V+E)
  • 41. 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
  • 42. Application of BFS • Find the shortest path in an undirected/directed unweighted graph. • Find the bipartite-ness of a graph. • Find cycle in a graph. • Find the connectedness of a graph. • And many more.
  • 43. Exercises on BFS • CLRS – Chapter 22 – elementary Graph Algorithms • Exercise you have to solve: (Page 602) – 22.2-7 (Wrestler) – 22.2-8 (Diameter) – 22.2-9 (Traverse)
  • 44. Depth-First Search • Input: – G = (V, E) (No source vertex given!) • Goal: – Explore the edges of G to “discover” every vertex in V starting at the most current visited node – Search may be repeated from multiple sources • Output: – 2 timestamps on each vertex: • d[v] = discovery time • f[v] = finishing time (done with examining v’s adjacency list) – Depth-first forest 1 2 5 4 3
  • 45. Depth-First Search • Search “deeper” in the graph whenever possible • Edges are explored out of the most recently discovered vertex v that still has unexplored edges • After all edges of v have been explored, the search “backtracks” from the parent of v • The process continues until all vertices reachable from the original source have been discovered • If undiscovered vertices remain, choose one of them as a new source and repeat the search from that vertex • DFS creates a “depth-first forest” 1 2 5 4 3
  • 46. DFS Additional Data Structures • Global variable: time-stamp – Incremented when nodes are discovered or finished • color[u] – similar to BFS – White before discovery, gray while processing and black when finished processing • prev[u] – predecessor of u • d[u], f[u] – discovery and finish times GRAY WHITE BLACK 0 2V d[u] f[u] 1 ≤ d[u] < f [u] ≤ 2 |V|
  • 47. Depth-First Search: The Code Data: color[V], time, prev[V],d[V], f[V] DFS(G) // where prog starts { for each vertex u  V { color[u] = WHITE; prev[u]=NIL; f[u]=inf; d[u]=inf; } time = 0; for each vertex u  V if (color[u] == WHITE) DFS_Visit(u); } DFS_Visit(u) { color[u] = GREY; time = time+1; d[u] = time; for each v  Adj[u] { if(color[v] == WHITE){ prev[v]=u; DFS_Visit(v);} } color[u] = BLACK; time = time+1; f[u] = time; } Initialize
  • 48. Depth-First Search: The Code Data: color[V], time, prev[V],d[V], f[V] DFS(G) // where prog starts { for each vertex u  V { color[u] = WHITE; prev[u]=NIL; f[u]=inf; d[u]=inf; } time = 0; for each vertex u  V if (color[u] == WHITE) DFS_Visit(u); } DFS_Visit(u) { color[u] = GREY; time = time+1; d[u] = time; for each v  Adj[u] { if(color[v] == WHITE){ prev[v]=u; DFS_Visit(v);} } color[u] = BLACK; time = time+1; f[u] = time; } What does d[u] represent?
  • 49. Depth-First Search: The Code Data: color[V], time, prev[V],d[V], f[V] DFS(G) // where prog starts { for each vertex u  V { color[u] = WHITE; prev[u]=NIL; f[u]=inf; d[u]=inf; } time = 0; for each vertex u  V if (color[u] == WHITE) DFS_Visit(u); } DFS_Visit(u) { color[u] = GREY; time = time+1; d[u] = time; for each v  Adj[u] { if(color[v] == WHITE){ prev[v]=u; DFS_Visit(v);} } color[u] = BLACK; time = time+1; f[u] = time; } What does f[u] represent?
  • 50. Depth-First Search: The Code Data: color[V], time, prev[V],d[V], f[V] DFS(G) // where prog starts { for each vertex u  V { color[u] = WHITE; prev[u]=NIL; f[u]=inf; d[u]=inf; } time = 0; for each vertex u  V if (color[u] == WHITE) DFS_Visit(u); } DFS_Visit(u) { color[u] = GREY; time = time+1; d[u] = time; for each v  Adj[u] { if(color[v] == WHITE){ prev[v]=u; DFS_Visit(v); }} color[u] = BLACK; time = time+1; f[u] = time; } Will all vertices eventually be colored black?
  • 52. DFS Example 1 | | | | | | | | source vertex d f S A B C D E F G
  • 53. DFS Example 1 | | | | | | 2 | | source vertex d f S A B C D E F G
  • 54. DFS Example 1 | | | | | 3 | 2 | | source vertex d f S A B C D E F G
  • 55. DFS Example 1 | | | | | 3 | 4 2 | | source vertex d f S A B C D E F G
  • 56. DFS Example 1 | | | | 5 | 3 | 4 2 | | source vertex d f S A B C D E F G
  • 57. DFS Example 1 | | | | 5 | 6 3 | 4 2 | | source vertex d f S A B C D E F G
  • 58. DFS Example 1 | | | | 5 | 6 3 | 4 2 | 7 | source vertex d f S A B C D E F G
  • 59. DFS Example 1 | 8 | | | 5 | 6 3 | 4 2 | 7 | source vertex d f S A B C D E F G
  • 60. DFS Example 1 | 8 | | | 5 | 6 3 | 4 2 | 7 9 | source vertex d f What is the structure of the grey vertices? What do they represent? S A B C D E F G
  • 61. DFS Example 1 | 8 | | | 5 | 6 3 | 4 2 | 7 9 |10 source vertex d f S A B C D E F G
  • 62. DFS Example 1 | 8 |11 | | 5 | 6 3 | 4 2 | 7 9 |10 source vertex d f S A B C D E F G
  • 63. DFS Example 1 |12 8 |11 | | 5 | 6 3 | 4 2 | 7 9 |10 source vertex d f S A B C D E F G
  • 64. DFS Example 1 |12 8 |11 13| | 5 | 6 3 | 4 2 | 7 9 |10 source vertex d f S A B C D E F G
  • 65. DFS Example 1 |12 8 |11 13| 14| 5 | 6 3 | 4 2 | 7 9 |10 source vertex d f S A B C D E F G
  • 66. DFS Example 1 |12 8 |11 13| 14|15 5 | 6 3 | 4 2 | 7 9 |10 source vertex d f S A B C D E F G
  • 67. DFS Example 1 |12 8 |11 13|16 14|15 5 | 6 3 | 4 2 | 7 9 |10 source vertex d f S A B C D E F G
  • 68. Depth-First Search: The Code Data: color[V], time, prev[V],d[V], f[V] DFS(G) // where prog starts { for each vertex u  V { color[u] = WHITE; prev[u]=NIL; f[u]=inf; d[u]=inf; } time = 0; for each vertex u  V if (color[u] == WHITE) DFS_Visit(u); } DFS_Visit(u) { color[u] = GREY; time = time+1; d[u] = time; for each v  Adj[u] { if (color[v] == WHITE) prev[v]=u; DFS_Visit(v); } color[u] = BLACK; time = time+1; f[u] = time; } What will be the running time?
  • 69. Depth-First Search: The Code Data: color[V], time, prev[V],d[V], f[V] DFS(G) // where prog starts { for each vertex u  V { color[u] = WHITE; prev[u]=NIL; f[u]=inf; d[u]=inf; } time = 0; for each vertex u  V if (color[u] == WHITE) DFS_Visit(u); } DFS_Visit(u) { color[u] = GREY; time = time+1; d[u] = time; for each v  Adj[u] { if (color[v] == WHITE) prev[v]=u; DFS_Visit(v); } color[u] = BLACK; time = time+1; f[u] = time; } Running time: O(V2 ) because call DFS_Visit on each vertex, and the loop over Adj[] can run as many as |V| times O(V) O(V) O(V)
  • 70. Depth-First Search: The Code Data: color[V], time, prev[V],d[V], f[V] DFS(G) // where prog starts { for each vertex u  V { color[u] = WHITE; prev[u]=NIL; f[u]=inf; d[u]=inf; } time = 0; for each vertex u  V if (color[u] == WHITE) DFS_Visit(u); } DFS_Visit(u) { color[u] = GREY; time = time+1; d[u] = time; for each v  Adj[u] { if (color[v] == WHITE) prev[v]=u; DFS_Visit(v); } color[u] = BLACK; time = time+1; f[u] = time; } BUT, there is actually a tighter bound. How many times will DFS_Visit() actually be called?
  • 71. Depth-First Search: The Code Data: color[V], time, prev[V],d[V], f[V] DFS(G) // where prog starts { for each vertex u  V { color[u] = WHITE; prev[u]=NIL; f[u]=inf; d[u]=inf; } time = 0; for each vertex u  V if (color[u] == WHITE) DFS_Visit(u); } DFS_Visit(u) { color[u] = GREY; time = time+1; d[u] = time; for each v  Adj[u] { if (color[v] == WHITE) prev[v]=u; DFS_Visit(v); } color[u] = BLACK; time = time+1; f[u] = time; } So, running time of DFS = O(V+E)
  • 72. Depth-First Sort Analysis • This running time argument is an informal example of amortized analysis – “Charge” the exploration of edge to the edge: • Each loop in DFS_Visit can be attributed to an edge in the graph • Runs once per edge if directed graph, twice if undirected • Thus loop will run in O(E) time, algorithm O(V+E) – Considered linear for graph, b/c adj list requires O(V+E) storage – Important to be comfortable with this kind of reasoning and analysis
  • 73. 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? – No
  • 74. DFS Example 1 |12 8 |11 13|16 14|15 5 | 6 3 | 4 2 | 7 9 |10 source vertex d f Tree edges
  • 75. 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) • Self loops are considered as to be back edge.
  • 76. DFS Example 1 |12 8 |11 13|16 14|15 5 | 6 3 | 4 2 | 7 9 |10 source vertex d f Tree edges Back edges
  • 77. 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 – Forward edge: from ancestor to descendent • Not a tree edge, though • From grey node to black node
  • 78. DFS Example 1 |12 8 |11 13|16 14|15 5 | 6 3 | 4 2 | 7 9 |10 source vertex d f Tree edges Back edges Forward edges
  • 79. 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 – Forward edge: from ancestor to descendent – Cross edge: between a tree or subtrees • From a grey node to a black node
  • 80. DFS Example 1 |12 8 |11 13|16 14|15 5 | 6 3 | 4 2 | 7 9 |10 source vertex d f Tree edges Back edges Forward edges Cross edges
  • 81. 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 – Forward edge: from ancestor to descendent – Cross edge: between a tree or subtrees • Note: tree & back edges are important; most algorithms don’t distinguish forward & cross
  • 82. More about the edges • Let (u,v) is an edge. – If (color[v] = WHITE) then (u,v) is a tree edge – If (color[v] = GRAY) then (u,v) is a back edge – If (color[v] = BLACK) then (u,v) is a forward/cross edge • Forward Edge: d[u]<d[v] • Cross Edge: d[u]>d[v]
  • 83. Depth-First Search - Timestamps 3/6 7/8 1/10 2/9 12/13 4/5 a b s d e f B F 11/16 14/15 c g C C C C B
  • 84. Depth-First Search - Timestamps a e s b f d B F c g C C C C B
  • 85. Depth-First Search: Detect Edge Data: color[V], time, prev[V],d[V], f[V] DFS(G) // where prog starts { for each vertex u  V { color[u] = WHITE; prev[u]=NIL; f[u]=inf; d[u]=inf; } time = 0; for each vertex u  V if (color[u] == WHITE) DFS_Visit(u); } DFS_Visit(u) { color[u] = GREY; time = time+1; d[u] = time; for each v  Adj[u] { detect edge type using “color[v]” if(color[v] == WHITE){ prev[v]=u; DFS_Visit(v); }} color[u] = BLACK; time = time+1; f[u] = time; }
  • 86. DFS: Kinds Of Edges • Thm 22.10: If G is undirected, a DFS produces only tree and back edges • Proof by contradiction: – Assume there’s a forward edge • But F? edge must actually be a back edge (why?) source F?
  • 87. DFS: Kinds Of Edges • Thm 22.10: If G is undirected, a DFS produces only tree and back edges • Proof by contradiction: – 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 source C?
  • 88. 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 • Thus, can run DFS to find whether a graph has a cycle
  • 89. DFS And Cycles Data: color[V], time, prev[V],d[V], f[V] DFS(G) // where prog starts { for each vertex u  V { color[u] = WHITE; prev[u]=NIL; f[u]=inf; d[u]=inf; } time = 0; for each vertex u  V if (color[u] == WHITE) DFS_Visit(u); } DFS_Visit(u) { color[u] = GREY; time = time+1; d[u] = time; for each v  Adj[u] { if (color[v]==WHITE){ prev[v]=u; DFS_Visit(v); } } color[u] = BLACK; time = time+1; f[u] = time; } How would you modify the code to detect cycles?
  • 90. DFS And Cycles Data: color[V], time, prev[V],d[V], f[V] DFS(G) // where prog starts { for each vertex u  V { color[u] = WHITE; prev[u]=NIL; f[u]=inf; d[u]=inf; } time = 0; for each vertex u  V if (color[u] == WHITE) DFS_Visit(u); } DFS_Visit(u) { color[u] = GREY; time = time+1; d[u] = time; for each v  Adj[u] { if (color[v]==WHITE){ prev[v]=u; DFS_Visit(v); } else {cycle exists;} } color[u] = BLACK; time = time+1; f[u] = time; } What will be the running time?
  • 91. DFS And Cycles • What will be the running time for undirected graph to detect cycle? • A: O(V+E) • We can actually determine if cycles exist in O(V) time – How??
  • 92. DFS And Cycles • What will be the running time for undirected graph to detect cycle? • 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
  • 93. DFS And Cycles • What will be the running time for directed graph to detect cycle? • A: O(V+E)
  • 94. Exercises on DFS • CLRS Chapter 22 (Elementary Graph Algorithms) • Exercise: (Page – 22.3-5 –Detect edge using d[u], d[v], f[u], f[v] – 22.3-12 – Connected Component – 22.3-13 – Singly connected
  • 95. Some applications of BFS and DFS • Topological Sort (Topic of Next Lecture) • Euler Path (Topic of Next Lecture) • Dictionary Search • Mathematical Problem • Grid Traversal
  • 96. The idea of State/Node • Parameters describing a scenario • Useless Parameters – If value of the parameter change doesn’t affect the outcome – If value of the parameter can be derived from other parameters • Useful Parameter – Not useless!!!
  • 97. Example - States • Grid Problem, direction change takes time • Grid Problem, blocks alternating