CSE 431/531: Algorithm Analysis and Design (Spring 2020) Graph Basics Lecturer: Shi Li Department of Computer Science and Engineering University at Buffalo
Outline Graphs 1 Connectivity and Graph Traversal 2 Testing Bipartiteness Topological Ordering 3 Bridges in a Graph 4 2/36
Examples of Graphs Figure: Road Networks Figure: Internet Figure: Social Networks Figure: Transition Graphs 3/36
(Undirected) Graph G = ( V, E ) 1 7 2 3 4 5 8 6 V : set of vertices (nodes); V = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 } 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 }} 4/36
Abuse of Notations For (undirected) graphs, we often use ( i, j ) to denote the set { i, j } . We call ( i, j ) an unordered pair; in this case ( i, j ) = ( j, i ) . 1 7 2 3 4 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) } 5/36
Social Network : Undirected Transition Graph : Directed Road Network : Directed or Undirected Internet : Directed or Undirected 6/36
Representation of Graphs 1 7 1: 2 3 6: 5 2: 1 3 4 5 7: 3 8 2 3 3: 1 2 5 7 8 4 5 8 4: 2 5 8: 3 7 6 5: 2 3 4 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 . 7/36
Comparison of Two Representations Assuming we are dealing with undirected graphs n : number of vertices m : number of edges, assuming n − 1 ≤ m ≤ n ( n − 1) / 2 d v : number of neighbors of v Matrix Linked Lists O ( n 2 ) memory usage O ( m ) time to check ( u, v ) ∈ E O (1) O ( d u ) time to list all neighbours of v O ( n ) O ( d v ) 8/36
Outline Graphs 1 Connectivity and Graph Traversal 2 Testing Bipartiteness Topological Ordering 3 Bridges in a Graph 4 9/36
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) 10/36
Breadth-First Search (BFS) Build layers L 0 , L 1 , L 2 , L 3 , · · · L 0 = { s } L j +1 contains all nodes that are not in L 0 ∪ L 1 ∪ · · · ∪ L j and have an edge to a vertex in L j 1 7 2 3 4 5 8 6 11/36
Implementing BFS using a Queue BFS ( s ) head ← 1 , tail ← 1 , queue [1] ← s 1 mark s as “visited” and all other vertices as “unvisited” 2 while head ≥ tail 3 v ← queue [ tail ] , tail ← tail + 1 4 for all neighbours u of v 5 if u is “unvisited” then 6 head ← head + 1 , queue [ head ] = u 7 mark u as “visited” 8 Running time: O ( n + m ) . 12/36
Example of BFS via Queue head 1 7 1 2 3 4 5 7 8 6 2 3 4 5 8 tail v 6 13/36
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 7 2 3 4 5 8 6 14/36
Implementing DFS using Recurrsion DFS( s ) mark all vertices as “unvisited” 1 recursive-DFS( s ) 2 recursive-DFS ( v ) mark v as “visited” 1 for all neighbours u of v 2 if u is unvisited then recursive-DFS( u ) 3 15/36
Outline Graphs 1 Connectivity and Graph Traversal 2 Testing Bipartiteness Topological Ordering 3 Bridges in a Graph 4 16/36
Testing Bipartiteness: Applications of BFS Def. A graph G = ( V, E ) is a bipartite graph if there is a partition of V into two sets L and R such that for every edge ( u, v ) ∈ E , we have either u ∈ L, v ∈ R or v ∈ L, u ∈ R . 17/36
Testing Bipartiteness Taking an arbitrary vertex s ∈ V Assuming s ∈ L w.l.o.g Neighbors of s must be in R Neighbors of neighbors of s must be in L · · · Report “not a bipartite graph” if contradiction was found If G contains multiple connected components, repeat above algorithm for each component 18/36
Test Bipartiteness bad edges! 19/36
Testing Bipartiteness using BFS BFS ( s ) head ← 1 , tail ← 1 , queue [1] ← s 1 mark s as “visited” and all other vertices as “unvisited” 2 color [ s ] ← 0 3 while head ≥ tail 4 v ← queue [ tail ] , tail ← tail + 1 5 for all neighbours u of v 6 if u is “unvisited” then 7 head ← head + 1 , queue [ head ] = u 8 mark u as “visited” 9 color [ u ] ← 1 − color [ v ] 10 elseif color [ u ] = color [ v ] then 11 print(“ G is not bipartite”) and exit 12 20/36
Testing Bipartiteness using BFS mark all vertices as “unvisited” 1 for each vertex v ∈ V 2 if v is “unvisited” then 3 test-bipartiteness( v ) 4 print(“ G is bipartite”) 5 Obs. Running time of algorithm = O ( n + m ) 21/36
Outline Graphs 1 Connectivity and Graph Traversal 2 Testing Bipartiteness Topological Ordering 3 Bridges in a Graph 4 22/36
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 7 2 9 8 23/36
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 7 2 9 8 24/36
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? A: Use linked-lists of outgoing edges Maintain the in-degree d v of vertices Maintain a queue (or stack) of vertices v with d v = 0 25/36
topological-sort ( G ) let d v ← 0 for every v ∈ V 1 for every v ∈ V 2 for every u such that ( v, u ) ∈ E 3 d u ← d u + 1 4 S ← { v : d v = 0 } , i ← 0 5 while S � = ∅ 6 v ← arbitrary vertex in S , S ← S \ { v } 7 i ← i + 1 , π ( v ) ← i 8 for every u such that ( v, u ) ∈ E 9 d u ← d u − 1 10 if d u = 0 then add u to S 11 12 if i < n then output “not a DAG” S can be represented using a queue or a stack Running time = O ( n + m ) 26/36
S as a Queue or a Stack DS Queue Stack Initialization head ← 0 , tail ← 1 top ← 0 Non-Empty? head ≥ tail top > 0 Add ( v ) head ← head + 1 top ← top + 1 S [ head ] ← v S [ top ] ← v Retrieve v v ← S [ tail ] v ← S [ top ] tail ← tail + 1 top ← top − 1 27/36
Outline Graphs 1 Connectivity and Graph Traversal 2 Testing Bipartiteness Topological Ordering 3 Bridges in a Graph 4 28/36
Type of edges with respect to a tree Given a graph G = ( V, E ) and a rooted tree T in G , edges in G can be one of the three types: tree edges Tree edges: edges in T Cross edges ( u, v ) : u and v do not have an ancestor-descendant relation cross edges Vertical edges ( u, v ) : u is an ancestor of v , or v is an ancestor of u vertical edges 29/36
Properties of a BFS Tree Given a tree BFS tree T of a graph G , Can there be vertical edges? No. Can there be cross edges ( u, v ) with u and v 2 levels apart? No. For any cross edge ( u, v ) , u and v are at most 1 level apart. 30/36
Properties of a DFS Tree Given a tree DFS tree T of a graph G , Can there be cross edges? No. All non-tree edges are vertical edges. 31/36
Bridges in a Graph Def. Given a connected graph G = ( V, E ) , an edge e ∈ E is called a bridge if the graph G = ( V, E \ { e } ) is disconnected. bridges 32/36
There are only tree edges and vertical h array edges 0 0 Vertical edges are not 1 0 bridges 1 A tree edge ( v, u ) is 0 0 2 not a bridge if some 2 1 vertical edge jumping 2 0 3 from below u to above 2 1 0 v 2 4 2 Other tree edges are bridges 5 2 33/36
level ( v ) : the level of h array vertex v in DFS tree 0 T v : the sub tree rooted 0 at v 1 0 1 h ( v ) : the smallest level 0 0 that can be reached 2 2 1 using a vertical edge from vertices in T v 0 2 3 0 2 1 ( parent ( u ) , u ) is a 2 4 bridge if 2 h ( u ) ≥ level ( u ) . 5 2 34/36
recursive-DFS ( v ) mark v as “visited” 1 h ( v ) ← ∞ 2 for all neighbours u of v 3 if u is unvisited then 4 level ( u ) ← level ( v ) + 1 5 recursive-DFS( u ) 6 if h ( u ) ≥ level ( u ) then claim ( v, u ) is a bridge 7 if h ( u ) < h ( v ) then h ( v ) ← h ( u ) 8 else if level ( u ) < level ( v ) − 1 then 9 if level ( u ) < h ( v ) then h ( v ) ← level ( u ) 10 35/36
Finding Bridges mark all vertices as “unvisited” 1 for every v ∈ V do 2 if v is unvisited then 3 level ( v ) ← 0 4 recursive-DFS( v ) 5 36/36
Recommend
More recommend