Lectures 23-24: Graph Basics CSE 431/531: Analysis of Algorithms Lecturer: Shi Li

advertisement
CSE 431/531: Analysis of Algorithms
Lectures 23-24: Graph Basics
Lecturer: Shi Li
Department of Computer Science and Engineering
University at Buffalo
Spring 2016
MoWeFr 3:00-3:50pm
Knox 110
Outline
1
Graphs
2
Connectivity and Graph Traversal
3
Topological Ordering
Definition of a Graph: G = (V, E)
1
2
V : a set of vertices (nodes);
V = {1, 2, 3, 4, 5, 6, 7, 8}
E: pairwise relationships among V ;
4
7
3
5
6
8
Definition of a Graph: G = (V, E)
1
2
V : a set of vertices (nodes);
V = {1, 2, 3, 4, 5, 6, 7, 8}
4
7
3
5
8
6
E: pairwise relationships among V ;
(undirected) graphs: relationship is symmetric, E contains
subsets of size 2
E = {{1, 2}, {1, 3}, {2, 3}, {2, 4}, {2, 5}, {3, 5}, {3, 7}, {3, 8},
{4, 5}, {5, 6}, {7, 8}}
Definition of a Graph: G = (V, E)
1
2
V : a set of vertices (nodes);
V = {1, 2, 3, 4, 5, 6, 7, 8}
4
7
3
5
8
6
E: pairwise relationships among V ;
(undirected) graphs: relationship is symmetric, E contains
subsets of size 2
E = {{1, 2}, {1, 3}, {2, 3}, {2, 4}, {2, 5}, {3, 5}, {3, 7}, {3, 8},
{4, 5}, {5, 6}, {7, 8}}
directed graphs: relationship is asymmetric, E contains
ordered pairs
E = {(1, 2), (1, 3), (3, 2), (4, 2), (2, 5), (5, 3), (3, 7), (3, 8),
(4, 5), (5, 6), (6, 5), (8, 7)}
Abuse of Notations
For (undirected) graphs, we often use (i, j) to denote the set
{i, j}.
We call (i, j) an unordered pair.
1
2
4
7
3
5
8
6
E = {(1, 2), (1, 3), (2, 3), (2, 4), (2, 5), (3, 5), (3, 7), (3, 8),
(4, 5), (5, 6), (7, 8)}
Representation of Graphs
1
2
4
7
3
5
6
8
1
2
3
4
5
6
7
8
1
0
1
1
0
0
0
0
0
2
1
0
1
1
1
0
0
0
3
1
1
0
0
1
0
1
1
4
0
1
0
0
1
0
0
0
5
0
1
1
1
0
1
0
0
6
0
0
0
0
1
0
0
0
7
0
0
1
0
0
0
0
1
8
0
0
1
0
0
0
1
0
Adjacency matrix
n × n matrix, A[u, v] = 1 if (u, v) ∈ E and A[u, v] = 0
otherwise
A is symmetric if graph is undirected
Representation of Graphs
1
2
4
7
3
5
6
8
1: 2
3
2: 1
3
4
5
6: 5
3: 1
2
5
7
4: 2
5
5: 2
3
4
7: 3
8
8: 3
7
8
6
Adjacency matrix
n × n matrix, A[u, v] = 1 if (u, v) ∈ E and A[u, v] = 0
otherwise
A is symmetric if graph is undirected
Linked lists
For every vertex v, there is a linked list containing all
neighbours of v.
Comparison of Two Representations
n: number of vertices
m: number of edges
dv : number of neighbors of v
Matrix
memory
check (u, v) ∈ E
list all neighbours of v
Linked Lists
Comparison of Two Representations
n: number of vertices
m: number of edges
dv : number of neighbors of v
Matrix
memory
check (u, v) ∈ E
list all neighbours of v
O(n2 )
Linked Lists
Comparison of Two Representations
n: number of vertices
m: number of edges
dv : number of neighbors of v
memory
check (u, v) ∈ E
list all neighbours of v
Matrix
Linked Lists
O(n2 )
O(n + m)
Comparison of Two Representations
n: number of vertices
m: number of edges
dv : number of neighbors of v
Matrix
Linked Lists
memory
O(n2 )
O(n + m)
check (u, v) ∈ E
O(1)
list all neighbours of v
Comparison of Two Representations
n: number of vertices
m: number of edges
dv : number of neighbors of v
Matrix
Linked Lists
memory
O(n2 )
O(n + m)
check (u, v) ∈ E
O(1)
O(du )
list all neighbours of v
Comparison of Two Representations
n: number of vertices
m: number of edges
dv : number of neighbors of v
Matrix
Linked Lists
memory
O(n2 )
O(n + m)
check (u, v) ∈ E
O(1)
O(du )
list all neighbours of v
O(n)
Comparison of Two Representations
n: number of vertices
m: number of edges
dv : number of neighbors of v
Matrix
Linked Lists
memory
O(n2 )
O(n + m)
check (u, v) ∈ E
O(1)
O(du )
list all neighbours of v
O(n)
O(dv )
Outline
1
Graphs
2
Connectivity and Graph Traversal
3
Topological Ordering
Connectivity Problem
Input: graph G = (V, E), (using linked lists)
two vertices s, t ∈ V
Output: whether there is a path connecting s to t in G
Connectivity Problem
Input: graph G = (V, E), (using linked lists)
two vertices s, t ∈ V
Output: whether there is a path connecting s to t in G
Algorithm: starting from s, search for all vertices that are
reachable from s and check if the set contains t
Connectivity Problem
Input: graph G = (V, E), (using linked lists)
two vertices s, t ∈ V
Output: whether there is a path connecting s to t in G
Algorithm: starting from s, search for all vertices that are
reachable from s and check if the set contains t
Breadth-First Search (BFS)
Connectivity Problem
Input: graph G = (V, E), (using linked lists)
two vertices s, t ∈ V
Output: whether there is a path connecting s to t in G
Algorithm: starting from s, search for all vertices that are
reachable from s and check if the set contains t
Breadth-First Search (BFS)
Depth-First Search (DFS)
Breadth-First Search (BFS)
Build layers L0 , L1 , L2 , L3 , · · ·
L0 = {s}
Lj+1 contains all nodes that are not in L0 ∪ L1 ∪ · · · ∪ Lj
and have an edge to a vertex in Lj
Breadth-First Search (BFS)
Build layers L0 , L1 , L2 , L3 , · · ·
L0 = {s}
Lj+1 contains all nodes that are not in L0 ∪ L1 ∪ · · · ∪ Lj
and have an edge to a vertex in Lj
1
2
4
7
3
5
6
8
Breadth-First Search (BFS)
Build layers L0 , L1 , L2 , L3 , · · ·
L0 = {s}
Lj+1 contains all nodes that are not in L0 ∪ L1 ∪ · · · ∪ Lj
and have an edge to a vertex in Lj
1
2
4
7
3
5
6
8
Breadth-First Search (BFS)
Build layers L0 , L1 , L2 , L3 , · · ·
L0 = {s}
Lj+1 contains all nodes that are not in L0 ∪ L1 ∪ · · · ∪ Lj
and have an edge to a vertex in Lj
1
2
4
7
3
5
6
8
Breadth-First Search (BFS)
Build layers L0 , L1 , L2 , L3 , · · ·
L0 = {s}
Lj+1 contains all nodes that are not in L0 ∪ L1 ∪ · · · ∪ Lj
and have an edge to a vertex in Lj
1
2
4
7
3
5
6
8
Depth-First Search (DFS)
Starting from s
Travel through the first edge leading out of the current vertex
When reach an already-visited vertex (“dead-end”), go back
Travel through the next edge
If tried all edges leading out of the current vertex, go back
Depth-First Search (DFS)
Starting from s
Travel through the first edge leading out of the current vertex
When reach an already-visited vertex (“dead-end”), go back
Travel through the next edge
If tried all edges leading out of the current vertex, go back
1
2
4
7
3
5
6
8
Depth-First Search (DFS)
Starting from s
Travel through the first edge leading out of the current vertex
When reach an already-visited vertex (“dead-end”), go back
Travel through the next edge
If tried all edges leading out of the current vertex, go back
1
2
4
7
3
5
6
8
Depth-First Search (DFS)
Starting from s
Travel through the first edge leading out of the current vertex
When reach an already-visited vertex (“dead-end”), go back
Travel through the next edge
If tried all edges leading out of the current vertex, go back
1
2
4
7
3
5
6
8
Depth-First Search (DFS)
Starting from s
Travel through the first edge leading out of the current vertex
When reach an already-visited vertex (“dead-end”), go back
Travel through the next edge
If tried all edges leading out of the current vertex, go back
1
2
4
7
3
5
6
8
Depth-First Search (DFS)
Starting from s
Travel through the first edge leading out of the current vertex
When reach an already-visited vertex (“dead-end”), go back
Travel through the next edge
If tried all edges leading out of the current vertex, go back
1
2
4
7
3
5
6
8
Depth-First Search (DFS)
Starting from s
Travel through the first edge leading out of the current vertex
When reach an already-visited vertex (“dead-end”), go back
Travel through the next edge
If tried all edges leading out of the current vertex, go back
1
2
4
7
3
5
6
8
Depth-First Search (DFS)
Starting from s
Travel through the first edge leading out of the current vertex
When reach an already-visited vertex (“dead-end”), go back
Travel through the next edge
If tried all edges leading out of the current vertex, go back
1
2
4
7
3
5
6
8
Depth-First Search (DFS)
Starting from s
Travel through the first edge leading out of the current vertex
When reach an already-visited vertex (“dead-end”), go back
Travel through the next edge
If tried all edges leading out of the current vertex, go back
1
2
4
7
3
5
6
8
Depth-First Search (DFS)
Starting from s
Travel through the first edge leading out of the current vertex
When reach an already-visited vertex (“dead-end”), go back
Travel through the next edge
If tried all edges leading out of the current vertex, go back
1
2
4
7
3
5
6
8
Depth-First Search (DFS)
Starting from s
Travel through the first edge leading out of the current vertex
When reach an already-visited vertex (“dead-end”), go back
Travel through the next edge
If tried all edges leading out of the current vertex, go back
1
2
4
7
3
5
6
8
Depth-First Search (DFS)
Starting from s
Travel through the first edge leading out of the current vertex
When reach an already-visited vertex (“dead-end”), go back
Travel through the next edge
If tried all edges leading out of the current vertex, go back
1
2
4
7
3
5
6
8
Implementing BFS using a Queue
BFS(s)
1
2
3
4
5
6
7
8
head ← 1, tail ← 1, queue[1] ← s
mark s as “visited” and all other vertices as “unvisited”
while head ≥ tail
v ← queue[tail], tail ← tail + 1
for all neighbours u of v
if u is unvisited then
head ← head + 1, queue[head] = u
mark u as “visited”
Running time: O(n + #edges in component containing s).
Implementing DFS using a Stack
DFS(s)
1
2
3
4
5
6
7
8
head ← 1, stack[1] ← s
mark all vertices as “unexplored”
while head ≥ 1
v ← stack[head], head ← head − 1
if v is unexplored then
mark v as “explored”
for all neighbours u of v
head ← head + 1, stack[head] = u
Running time: O(n + #edges in component containing s).
Implementing DFS using Recurrsion
DFS(s)
1
2
mark all vertices as “unexplored”
recursiveDFS(s)
recursiveDFS(v)
1
2
3
4
if v is explored then return
mark v as “explored”
for all neighbours u of v
DFS(u)
Outline
1
Graphs
2
Connectivity and Graph Traversal
3
Topological Ordering
Topological Ordering Problem
Input: a directed acyclic graph (DAG) G = (V, E)
Output: 1-to-1 function π : V → {1, 2, 3 · · · , n}, so that
if (u, v) ∈ E then π(u) < π(v)
a
b
c
d
e
g
h
i
f
Topological Ordering Problem
Input: a directed acyclic graph (DAG) G = (V, E)
Output: 1-to-1 function π : V → {1, 2, 3 · · · , n}, so that
if (u, v) ∈ E then π(u) < π(v)
4
5
1
3
6
2
9
8
7
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
a
b
c
d
e
g
h
i
f
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
a
b
1
d
e
g
h
i
f
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
a
b
1
d
e
g
h
i
f
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
a
b
1
d
e
2
h
i
f
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
a
b
1
d
e
2
h
i
f
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
a
b
1
3
e
2
h
i
f
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
a
b
1
3
e
2
h
i
f
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
4
b
1
3
e
2
h
i
f
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
4
b
1
3
e
2
h
i
f
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
4
5
1
3
e
2
h
i
f
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
4
5
1
3
e
2
h
i
f
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
4
5
1
3
6
2
h
i
f
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
4
5
1
3
6
2
h
i
f
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
4
5
1
3
6
2
h
i
7
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
4
5
1
3
6
2
h
i
7
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
4
5
1
3
6
2
h
8
7
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
4
5
1
3
6
2
h
8
7
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
4
5
1
3
6
2
9
8
7
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
4
5
1
3
6
2
9
8
7
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
Q: How to make the algorithm as efficient as possible?
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
Q: How to make the algorithm as efficient as possible?
Using linked-lists of outgoing edges
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
Q: How to make the algorithm as efficient as possible?
Using linked-lists of outgoing edges
Maintain the in-degree dv of vertices
Topological Ordering
Algorithm: each time take a vertex without incoming edges,
then remove the vertex and all its outgoing edges.
Q: How to make the algorithm as efficient as possible?
Using linked-lists of outgoing edges
Maintain the in-degree dv of vertices
Maintain a set of vertices v with dv = 0
TopologicalSort(G)
1
2
3
4
5
6
7
8
9
10
11
12
let dv ← 0 for every v ∈ V
for every v ∈ V
for every u such that (v, u) ∈ E
du ← du + 1
S ← {v : dv = 0}, i ← 0
while S 6= ∅
v ← arbitrary vertex in S, S ← S \ {v}
i ← i + 1, π(v) ← i
for every u such that (v, u) ∈ E
du ← du − 1
if du = 0 then add u to S
if i < n then output “not a DAG”
Running time = O(n + m)
Download