0% found this document useful (0 votes)
230 views

Graph Theory

- A graph G is represented by a set of vertices V and edges E connecting the vertices. - Breadth-first search (BFS) is an algorithm for exploring a graph by expanding the frontier of explored vertices across the breadth of the graph. - BFS uses a queue to iteratively dequeue the next vertex to explore, discover its neighbors, and enqueue them to be explored later. This process colors vertices white, gray, and black to track explored, discovered but not yet explored, and fully explored vertices respectively.

Uploaded by

Khayyam Ahmad
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
230 views

Graph Theory

- A graph G is represented by a set of vertices V and edges E connecting the vertices. - Breadth-first search (BFS) is an algorithm for exploring a graph by expanding the frontier of explored vertices across the breadth of the graph. - BFS uses a queue to iteratively dequeue the next vertex to explore, discover its neighbors, and enqueue them to be explored later. This process colors vertices white, gray, and black to track explored, discovered but not yet explored, and fully explored vertices respectively.

Uploaded by

Khayyam Ahmad
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 71

Graph Algorithms

David Luebke 1 12/08/21


Graphs
● A graph G = (V, E)
■ V = set of vertices
■ E = set of edges = subset of V  V
■ Thus |E| = O(|V|2)

David Luebke 2 12/08/21


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

David Luebke 3 12/08/21


Graphs
● 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

David Luebke 4 12/08/21


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

David Luebke 5 12/08/21


Graphs: Adjacency Matrix
● Example:
A 1 2 3 4
1
a 1

2 d
4 2
3
b c
??
3 4

David Luebke 6 12/08/21


Graphs: Adjacency Matrix
● Example:
A 1 2 3 4
1
a 1 0 1 1 0

2 d
4 2 0 0 1 0
b c 3 0 0 0 0
3 4 0 0 1 0

David Luebke 7 12/08/21


Graphs: Adjacency Matrix
● How much storage does the adjacency matrix
require?
● A: O(V2)
● What is the minimum amount of storage
needed by an adjacency matrix representation
of an undirected graph with 4 vertices?
● ?????

David Luebke 8 12/08/21


Graphs: Adjacency Matrix
● The adjacency matrix is a dense representation
■ Usually too much storage for large graphs
■ But can be very efficient for small graphs
● Most large interesting graphs are sparse
■ For this reason the adjacency list is often a more
appropriate representation

David Luebke 9 12/08/21


Graphs: Adjacency List
● Adjacency list: for each vertex v  V, store a list of
vertices adjacent to v
● Example:
■ Adj[1] = {2,3} 1
■ Adj[2] = {3}
■ Adj[3] = {} 2 4
■ Adj[4] = {3}
● Variation: can also keep
3
a list of edges coming into vertex

David Luebke 10 12/08/21


Graphs: Adjacency List
● How much storage is required?
■ The degree of a vertex v = # incident edges
○ Directed graphs have in-degree, out-degree
■ For directed graphs, # of items in adjacency lists is
 out-degree(v) = |E|
takes (V + E) storage (Why?)
■ For undirected graphs, # items in adj lists is
 degree(v) = 2 |E|
also (V + E) storage
● So: Adjacency lists take O(V+E) storage

David Luebke 11 12/08/21


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 12 12/08/21


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 13 12/08/21


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

● Explore vertices by scanning adjacency list of grey


vertices

David Luebke 14 12/08/21


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 15 12/08/21


Breadth-First Search: Example

r s t u

   

   
v w x y

David Luebke 16 12/08/21


Breadth-First Search: Example

r s t u

 0  

   
v w x y

Q: s
David Luebke 17 12/08/21
Breadth-First Search: Example

r s t u

1 0  

 1  
v w x y

Q: w r

David Luebke 18 12/08/21


Breadth-First Search: Example

r s t u

1 0 2 

 1 2 
v w x y

Q: r t x

David Luebke 19 12/08/21


Breadth-First Search: Example

r s t u

1 0 2 

2 1 2 
v w x y

Q: t x v

David Luebke 20 12/08/21


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 21 12/08/21


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 22 12/08/21


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 23 12/08/21


Breadth-First Search: Example

r s t u

1 0 2 3

2 1 2 3
v w x y

Q: y
David Luebke 24 12/08/21
Breadth-First Search: Example

r s t u

1 0 2 3

2 1 2 3
v w x y

Q: Ø
David Luebke 25 12/08/21
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 vertex v->d = u->d + 1;

that appears in v->p = u;


Enqueue(Q, v);
some other} vert’s
adjacencyu->color
list = BLACK;
}
} What will be the running time?
Total running time: O(V+E)

David Luebke 26 12/08/21


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 tree?
Total space used:
O(max(degree(v))) = O(E)
David Luebke 27 12/08/21
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 28 12/08/21


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 29 12/08/21


Depth-First Search
● Vertices initially colored white
● Then colored gray when discovered
● Then black when finished

David Luebke 30 12/08/21


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 31 12/08/21


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;
} }

What does u->d represent?


David Luebke 32 12/08/21
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;
} }

What does u->f represent?


David Luebke 33 12/08/21
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;
} }

Will all vertices eventually be colored black?


David Luebke 34 12/08/21
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;
} }

What will be the running time?


David Luebke 35 12/08/21
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;
} }

Running time: O(n2) because call DFS_Visit on each vertex,


and the loop over Adj[] can run as many as |V| times
David Luebke 36 12/08/21
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;
} }

BUT, there is actually a tighter bound.


How many times will DFS_Visit() actually be called?
David Luebke 37 12/08/21
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;
} }

So, running time of DFS = O(V+E)


David Luebke 38 12/08/21
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/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

David Luebke 39 12/08/21


DFS Example
source
vertex

David Luebke 40 12/08/21


DFS Example
source
vertex
d f
1 | | |

| |

| | |

David Luebke 41 12/08/21


DFS Example
source
vertex
d f
1 | | |

2 | |

| | |

David Luebke 42 12/08/21


DFS Example
source
vertex
d f
1 | | |

2 | |

3 | | |

David Luebke 43 12/08/21


DFS Example
source
vertex
d f
1 | | |

2 | |

3 | 4 | |

David Luebke 44 12/08/21


DFS Example
source
vertex
d f
1 | | |

2 | |

3 | 4 5 | |

David Luebke 45 12/08/21


DFS Example
source
vertex
d f
1 | | |

2 | |

3 | 4 5 | 6 |

David Luebke 46 12/08/21


DFS Example
source
vertex
d f
1 | 8 | |

2 | 7 |

3 | 4 5 | 6 |

David Luebke 47 12/08/21


DFS Example
source
vertex
d f
1 | 8 | |

2 | 7 |

3 | 4 5 | 6 |

David Luebke 48 12/08/21


DFS Example
source
vertex
d f
1 | 8 | |

2 | 7 9 |

3 | 4 5 | 6 |

What is the structure of the grey vertices?


What do they represent?
David Luebke 49 12/08/21
DFS Example
source
vertex
d f
1 | 8 | |

2 | 7 9 |10

3 | 4 5 | 6 |

David Luebke 50 12/08/21


DFS Example
source
vertex
d f
1 | 8 |11 |

2 | 7 9 |10

3 | 4 5 | 6 |

David Luebke 51 12/08/21


DFS Example
source
vertex
d f
1 |12 8 |11 |

2 | 7 9 |10

3 | 4 5 | 6 |

David Luebke 52 12/08/21


DFS Example
source
vertex
d f
1 |12 8 |11 13|

2 | 7 9 |10

3 | 4 5 | 6 |

David Luebke 53 12/08/21


DFS Example
source
vertex
d f
1 |12 8 |11 13|

2 | 7 9 |10

3 | 4 5 | 6 14|

David Luebke 54 12/08/21


DFS Example
source
vertex
d f
1 |12 8 |11 13|

2 | 7 9 |10

3 | 4 5 | 6 14|15

David Luebke 55 12/08/21


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 12/08/21


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 57 12/08/21


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 58 12/08/21
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 59 12/08/21


DFS Example
source
vertex
d f
1 |12 8 |11 13|16

2 | 7 9 |10

3 | 4 5 | 6 14|15

Tree edges Back edges


David Luebke 60 12/08/21
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

David Luebke 61 12/08/21


DFS Example
source
vertex
d f
1 |12 8 |11 13|16

2 | 7 9 |10

3 | 4 5 | 6 14|15

Tree edges Back edges Forward edges


David Luebke 62 12/08/21
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

David Luebke 63 12/08/21


DFS Example
source
vertex
d f
1 |12 8 |11 13|16

2 | 7 9 |10

3 | 4 5 | 6 14|15

Tree edges Back edges Forward edges Cross edges


David Luebke 64 12/08/21
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

David Luebke 65 12/08/21


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 66 12/08/21


DFS: Kinds Of Edges
● Thm 23.9: If G is undirected, a DFS produces only
tree and back edges
● Proof by contradiction:
■ Assume there’s a cross edge source
○ 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 67 12/08/21


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

David Luebke 68 12/08/21


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 69 12/08/21
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 70 12/08/21
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 71 12/08/21

You might also like