cs 225
play

CS 225 Data Structures No Novem ember er 15 Gr Graph aph Trav - PowerPoint PPT Presentation

CS 225 Data Structures No Novem ember er 15 Gr Graph aph Trav aversal als G G Carl Evans Gr Grap aphs To study all of these structures: 1. A common vocabulary 2. Graph implementations 3. Graph traversals 4. Graph algorithms


  1. CS 225 Data Structures No Novem ember er 15 – Gr Graph aph Trav aversal als G G Carl Evans

  2. Gr Grap aphs To study all of these structures: 1. A common vocabulary 2. Graph implementations 3. Graph traversals 4. Graph algorithms

  3. Tr Traversal: Objective: Visit every vertex and every edge in the graph. Purpose: Search for interesting sub-structures in the graph. We’ve seen traversal before ….but it’s different: • • Ordered • • Obvious Start • •

  4. Tr Traversal: BFS A C D B E F G H

  5. Tr Traversal: BFS v d P Adjacent Edges A B A C C D B D E E F F G H G H

  6. Tr Traversal: BFS v d P Adjacent Edges A 0 - C B D B 1 A A C E A C 1 A B A D E F C D B D 1 A A C F H E 2 C B C G E F F 2 C C D G G H G 3 E E F H H 2 D D G G H F E D B C A

  7. 1 BFS(G): 2 Input: Graph, G 3 Output: A labeling of the edges on 4 G as discovery and cross edges 5 6 foreach (Vertex v : G.vertices()): 7 setLabel(v, UNEXPLORED) 8 foreach (Edge e : G.edges()): 9 setLabel(e, UNEXPLORED) 10 foreach (Vertex v : G.vertices()): 11 if getLabel(v) == UNEXPLORED: 12 BFS(G, v) 14 BFS(G, v): 15 Queue q 16 setLabel(v, VISITED) 17 q.enqueue(v) 18 19 while !q.empty(): 20 v = q.dequeue() 21 foreach (Vertex w : G.adjacent(v)): 22 if getLabel(w) == UNEXPLORED: 23 setLabel(v, w, DISCOVERY) 24 setLabel(w, VISITED) 25 q.enqueue(w) 26 elseif getLabel(v, w) == UNEXPLORED: 27 setLabel(v, w, CROSS)

  8. BF BFS S An Analysis Q: Does our implementation handle disjoint graphs? If so, what code handles this? • How do we use this to count components? Q: Does our implementation detect a cycle? • How do we update our code to detect a cycle? Q: What is the running time?

  9. 1 BFS(G): 2 Input: Graph, G 3 Output: A labeling of the edges on 4 G as discovery and cross edges 5 6 foreach (Vertex v : G.vertices()): 7 setLabel(v, UNEXPLORED) 8 foreach (Edge e : G.edges()): 9 setLabel(e, UNEXPLORED) 10 foreach (Vertex v : G.vertices()): 11 if getLabel(v) == UNEXPLORED: 12 BFS(G, v) 14 BFS(G, v): 15 Queue q 16 setLabel(v, VISITED) 17 q.enqueue(v) 18 19 while !q.empty(): 20 v = q.dequeue() 21 foreach (Vertex w : G.adjacent(v)): 22 if getLabel(w) == UNEXPLORED: 23 setLabel(v, w, DISCOVERY) 24 setLabel(w, VISITED) 25 q.enqueue(w) 26 elseif getLabel(v, w) == UNEXPLORED: 27 setLabel(v, w, CROSS)

  10. Running g time of BFS v d P Adjacent Edges A 0 - C B D B 1 A A C E A C 1 A B A D E F C D B D 1 A A C F H E 2 C B C G E F F 2 C C D G G H G 3 E E F H While-loop at :19 ? H 2 D D G For-loop at :21 ? G H F E D B C A

  11. BFS BF S Observation ons v d P Adjacent Edges A 0 - C B D Q: What is a shortest path B 1 A A C E from A to H ? C 1 A B A D E F D 1 A A C F H Q: What is a shortest path E 2 C B C G from E to H ? F 2 C C D G G 3 E E F H Q: How does a cross edge H 2 D D G relate to d ? A C D B Q: What structure is made E F from discovery edges? G H

  12. BF BFS S Observation ons Obs. 1: BFS can be used to count components. Obs. 2: BFS can be used to detect cycles. Obs. 3: In BFS, d provides the shortest distance to every vertex. Obs. 4: In BFS, the endpoints of a cross edge never differ in distance, d , by more than 1: |d(u) - d(v)| = 1

  13. Tr Traversal: DFS D A B C F H E G K J

  14. 1 BFS(G): 2 Input: Graph, G 3 Output: A labeling of the edges on 4 G as discovery and cross edges 5 6 foreach (Vertex v : G.vertices()): 7 setLabel(v, UNEXPLORED) 8 foreach (Edge e : G.edges()): 9 setLabel(e, UNEXPLORED) 10 foreach (Vertex v : G.vertices()): 11 if getLabel(v) == UNEXPLORED: 12 BFS(G, v) 14 BFS(G, v): 15 Queue q 16 setLabel(v, VISITED) 17 q.enqueue(v) 18 19 while !q.empty(): 20 v = q.dequeue() 21 foreach (Vertex w : G.adjacent(v)): 22 if getLabel(w) == UNEXPLORED: 23 setLabel(v, w, DISCOVERY) 24 setLabel(w, VISITED) 25 q.enqueue(w) 26 elseif getLabel(v, w) == UNEXPLORED: 27 setLabel(v, w, CROSS)

  15. 1 DFS(G): 2 Input: Graph, G 3 Output: A labeling of the edges on 4 G as discovery and back edges 5 6 foreach (Vertex v : G.vertices()): 7 setLabel(v, UNEXPLORED) 8 foreach (Edge e : G.edges()): 9 setLabel(e, UNEXPLORED) 10 foreach (Vertex v : G.vertices()): 11 if getLabel(v) == UNEXPLORED: 12 DFS(G, v) 14 DFS(G, v): 15 Queue q 16 setLabel(v, VISITED) 17 q.enqueue(v) 18 19 while !q.empty(): 20 v = q.dequeue() 21 foreach (Vertex w : G.adjacent(v)): 22 if getLabel(w) == UNEXPLORED: 23 setLabel(v, w, DISCOVERY) 24 setLabel(w, VISITED) 25 DFS(G, w) 26 elseif getLabel(v, w) == UNEXPLORED: 27 setLabel(v, w, BACK)

  16. Tr Traversal: DFS D A B C F H E G K J

  17. Tr Traversal: DFS D A B C F H E G K J Discovery Edge Back Edge

  18. 1 BFS(G): 2 Input: Graph, G 3 Output: A labeling of the edges on 4 G as discovery and cross edges 5 6 foreach (Vertex v : G.vertices()): 7 setLabel(v, UNEXPLORED) 8 foreach (Edge e : G.edges()): 9 setLabel(e, UNEXPLORED) 10 foreach (Vertex v : G.vertices()): 11 if getLabel(v) == UNEXPLORED: 12 BFS(G, v) 14 BFS(G, v): 15 Queue q 16 setLabel(v, VISITED) 17 q.enqueue(v) 18 19 while !q.empty(): 20 v = q.dequeue() 21 foreach (Vertex w : G.adjacent(v)): 22 if getLabel(w) == UNEXPLORED: 23 setLabel(v, w, DISCOVERY) 24 setLabel(w, VISITED) 25 q.enqueue(w) 26 elseif getLabel(v, w) == UNEXPLORED: 27 setLabel(v, w, CROSS)

  19. 1 DFS(G): 2 Input: Graph, G 3 Output: A labeling of the edges on 4 G as discovery and back edges 5 6 foreach (Vertex v : G.vertices()): 7 setLabel(v, UNEXPLORED) 8 foreach (Edge e : G.edges()): 9 setLabel(e, UNEXPLORED) 10 foreach (Vertex v : G.vertices()): 11 if getLabel(v) == UNEXPLORED: 12 DFS(G, v) 14 DFS(G, v): 15 Queue q 16 setLabel(v, VISITED) 17 q.enqueue(v) 18 19 while !q.empty(): 20 v = q.dequeue() 21 foreach (Vertex w : G.adjacent(v)): 22 if getLabel(w) == UNEXPLORED: 23 setLabel(v, w, DISCOVERY) 24 setLabel(w, VISITED) 25 DFS(G, w) 26 elseif getLabel(v, w) == UNEXPLORED: 27 setLabel(v, w, BACK)

  20. Running g time of DFS D A Labeling: B C F H • Vertex: E G K J • Edge: Queries: • Vertex: • Edge:

  21. “The Muddy City” by CS Unplugged, Creative Commons BY-NC-SA 4.0

  22. Minimum Spanning g Tree Algorithms Input: Connected, undirected graph G with edge weights (unconstrained, but must be additive) Output: A graph G’ with the following properties: • G’ is a spanning graph of G • G’ is a tree (connected, acyclic) • G’ has a minimal total weight among all spanning trees A 4 8 2 7 1 B C D 2 5 3 9 F E

  23. Kr Kruskal’s Algorithm (A, D) B 15 5 (E, H) C 5 16 A (F, G) 2 10 11 (A, B) 13 16 E D 2 17 (B, D) H 8 12 F 12 (G, E) 9 4 G (G, H) (E, C) (C, H) (E, F) (F, C) (D, E) (B, C) (C, D) (A, F) (D, F)

  24. Kr Kruskal’s Algorithm (A, D) B 15 5 (E, H) C 5 16 A (F, G) 2 10 11 (A, B) 13 16 E D 2 17 (B, D) H 8 12 F 12 (G, E) 9 4 G (G, H) (E, C) (C, H) B C A D (E, F) (F, C) E F H (D, E) G (B, C) (C, D) (A, F) (D, F)

  25. Kr Kruskal’s Algorithm (A, D) B 15 1 KruskalMST(G): 5 (E, H) 2 DisjointSets forest C 5 16 A (F, G) 3 foreach (Vertex v : G): 2 10 11 4 forest.makeSet(v) (A, B) 16 13 E D 5 2 17 (B, D) 6 PriorityQueue Q // min edge weight H 8 12 7 foreach (Edge e : G): F (G, E) 12 9 8 Q.insert(e) 4 G (G, H) 9 10 Graph T = (V, {}) (E, C) 11 (C, H) 12 while |T.edges()| < n-1: 13 Vertex (u, v) = Q.removeMin() (E, F) 14 if forest.find(u) == forest.find(v): (F, C) 15 T.addEdge(u, v) 16 forest.union( forest.find(u), (D, E) B C 17 forest.find(v) ) A D (B, C) 18 19 return T (C, D) E F H G (A, F) (D, F)

  26. Kr Kruskal’s Algorithm Priority Queue: 1 KruskalMST(G): 2 DisjointSets forest Heap Sorted Array 3 foreach (Vertex v : G): Building 4 forest.makeSet(v) :7-9 5 6 PriorityQueue Q // min edge weight Each removeMin 7 foreach (Edge e : G): :13 8 Q.insert(e) 9 10 Graph T = (V, {}) 11 12 while |T.edges()| < n-1: 13 Vertex (u, v) = Q.removeMin() 14 if forest.find(u) == forest.find(v): 15 T.addEdge(u, v) 16 forest.union( forest.find(u), 17 forest.find(v) ) 18 19 return T

  27. Kruskal’s Algorithm Kr Priority Queue: 1 KruskalMST(G): 2 DisjointSets forest Total Running Time 3 foreach (Vertex v : G): Heap 4 forest.makeSet(v) 5 6 PriorityQueue Q // min edge weight Sorted Array 7 foreach (Edge e : G): 8 Q.insert(e) 9 10 Graph T = (V, {}) 11 12 while |T.edges()| < n-1: 13 Vertex (u, v) = Q.removeMin() 14 if forest.find(u) == forest.find(v): 15 T.addEdge(u, v) 16 forest.union( forest.find(u), 17 forest.find(v) ) 18 19 return T

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend