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)