u ndirected g raphs
play

U NDIRECTED G RAPHS Acknowledgement: The course slides are adapted - PowerPoint PPT Presentation

BBM 202 - ALGORITHMS D EPT . OF C OMPUTER E NGINEERING U NDIRECTED G RAPHS Acknowledgement: The course slides are adapted from the slides prepared by R. Sedgewick and K. Wayne of Princeton University. TODAY Undirected Graphs


  1. 
 
 Depth-first search Goal. Find all vertices connected to s (and a path). Idea. Mimic maze exploration. Algorithm. • Use recursion (ball of string). • Mark each visited vertex (and keep track of edge taken to visit it). • Return (retrace steps) when no unvisited options. Data structures. • boolean[] marked to mark visited vertices. • int[] edgeTo to keep tree of paths. 
 (edgeTo[w] == v) means that edge v-w taken to visit w for first time

  2. Depth-first search public class DepthFirstPaths { marked[v] = true private boolean[] marked; if v connected to s private int[] edgeTo; edgeTo[v] = previous private int s; vertex on path from s to v public DepthFirstSearch(Graph G, int s) { initialize data structures ... dfs(G, s); find vertices connected to s } recursive DFS does the private void dfs(Graph G, int v) work { marked[v] = true; for (int w : G.adj(v)) if (!marked[w]) { dfs(G, w); edgeTo[w] = v; } } } 27

  3. Depth-first search properties Proposition. DFS marks all vertices connected to s in time proportional to 
 the sum of their degrees. 
 Pf. set of marked source vertices • Correctness: s - if w marked, then w connected to s (why?) - if w connected to s , then w marked 
 (if w unmarked, then consider last edge 
 v on a path from s to w that goes from a 
 no such edge set of can exist marked vertex to an unmarked one) unmarked vertices x • Running time: 
 Each vertex connected to s is visited once. w 28

  4. 
 Depth-first search properties Proposition. After DFS, can find vertices connected to s in constant time and can find a path to s (if one exists) in time proportional to its length. Pf. edgeTo[] is a parent-link representation of a tree rooted at s . public boolean hasPathTo(int v) { return marked[v]; } edgeTo[] public Iterable<Integer> pathTo(int v) 0 { 1 2 if (!hasPathTo(v)) return null; 2 0 Stack<Integer> path = new Stack<Integer>(); 3 2 for (int x = v; x != s; x = edgeTo[x]) 4 3 path.push(x); 5 3 path.push(s); return path; } 29

  5. U NDIRECTED G RAPHS ‣ Graph API ‣ Depth-first search ‣ Breadth-first search ‣ Connected components ‣ Challenges

  6. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. tinyCG.txt 0 0 2 2 V 6 E 8 0 5 2 4 1 1 2 3 1 2 0 1 3 3 3 4 3 5 5 5 4 4 0 2 graph G 31

  7. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 0 2 2 queue v edgeTo[v] 0 – 1 – 1 1 2 – 3 – 4 – 3 3 5 – 5 5 4 4 add 0 to queue 32

  8. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 0 2 2 queue v edgeTo[v] 0 – 1 – 1 1 2 – 3 – 4 – 3 3 5 – 5 5 4 4 0 dequeue 0 33

  9. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 0 2 2 2 queue v edgeTo[v] 0 – 1 – 1 1 0 2 – 3 – 4 – 3 3 5 – 5 5 4 4 dequeue 0 34

  10. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 0 2 2 2 queue v edgeTo[v] 0 – 0 1 – 1 1 1 2 0 3 – 4 – 3 3 5 – 5 5 4 4 2 dequeue 0 35

  11. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 0 2 2 2 queue v edgeTo[v] 0 – 1 0 1 1 1 2 0 3 – 4 – 3 3 1 0 5 – 5 5 5 4 4 2 dequeue 0 36

  12. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 0 2 2 2 queue v edgeTo[v] 0 – 1 0 1 1 1 2 0 5 3 – 4 – 3 3 1 5 0 5 5 5 4 4 2 0 done 37

  13. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 2 queue v edgeTo[v] 0 – 1 0 1 1 1 2 0 5 3 – 4 – 3 3 1 5 0 5 5 5 4 4 2 dequeue 2 38

  14. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 2 queue v edgeTo[v] 0 – 1 0 1 1 1 2 0 3 – 4 – 3 3 5 5 0 5 5 5 4 4 1 dequeue 2 39

  15. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 2 queue v edgeTo[v] 0 – 1 0 1 1 1 2 0 3 – 4 – 3 3 5 5 0 5 5 5 4 4 1 dequeue 2 40

  16. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 2 queue v edgeTo[v] 0 – 1 0 1 1 1 2 0 3 2 – 4 – 3 3 3 5 5 0 5 5 5 4 4 1 dequeue 2 41

  17. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 2 queue v edgeTo[v] 0 – 1 0 1 1 1 2 0 3 2 3 4 2 – 3 3 3 5 5 0 5 5 5 4 4 4 1 dequeue 2 42

  18. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 2 queue v edgeTo[v] 0 – 1 0 4 1 1 1 2 0 3 2 3 4 2 3 3 3 5 5 0 5 5 5 4 4 4 1 2 done 43

  19. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 4 1 1 2 0 3 2 3 4 2 3 3 3 5 5 0 5 5 5 4 4 4 1 dequeue 1 44

  20. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 1 2 0 3 2 4 4 2 3 3 3 3 5 0 5 5 5 4 4 4 5 dequeue 1 45

  21. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 1 2 0 3 2 4 4 2 3 3 3 3 5 0 5 5 5 4 4 4 5 dequeue 1 46

  22. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 1 2 0 3 2 4 4 2 3 3 3 3 5 0 5 5 5 4 4 4 5 1 done 47

  23. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 4 2 3 3 3 3 5 0 5 5 4 4 4 5 dequeue 5 48

  24. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 2 3 3 3 4 5 0 5 5 4 4 4 3 dequeue 5 49

  25. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 2 3 3 3 4 5 0 5 5 4 4 4 3 dequeue 5 50

  26. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 2 3 3 3 4 5 0 5 5 4 4 4 3 5 done 51

  27. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 2 3 3 4 5 0 5 4 4 4 3 dequeue 3 52

  28. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 2 3 3 5 0 5 4 4 4 4 dequeue 3 53

  29. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 2 3 3 5 0 5 4 4 4 4 dequeue 3 54

  30. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 2 3 3 5 0 5 4 4 4 4 dequeue 3 55

  31. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 2 3 5 0 5 4 4 4 4 3 done 56

  32. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 2 3 5 0 5 4 4 4 dequeue 4 57

  33. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 2 3 5 0 5 4 4 dequeue 4 58

  34. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 2 3 5 0 5 4 4 dequeue 4 59

  35. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 queue v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 2 3 5 0 5 4 4 4 done 60

  36. Breadth-first search Repeat until queue is empty: • Remove vertex v from queue. • Add to queue all unmarked vertices adjacent to v and mark them. 0 2 v edgeTo[v] 0 – 1 0 1 2 0 3 2 4 2 3 5 0 5 4 done 61

  37. Breadth-first search Depth-first search. Put unvisited vertices on a stack. Breadth-first search. Put unvisited vertices on a queue. Shortest path. Find path from s to t that uses fewest number of edges. BFS (from source vertex s) Put s onto a FIFO queue, and mark s as visited. Repeat until the queue is empty: - remove the least recently added vertex v - add each of v's unvisited neighbors to the queue, 
 and mark them as visited. Intuition. BFS examines vertices in increasing distance from s . 62

  38. 
 
 Breadth-first search properties Proposition. BFS computes shortest path (number of edges) from s 
 in a connected graph in time proportional to E + V . Pf. [correctness] Queue always consists of zero or more vertices of distance k from s , followed by zero or more vertices of distance k + 1 . Pf. [running time] Each vertex connected to s is visited once. 1 4 0 2 1 0 2 3 3 5 4 5 standard drawing dist = 0 dist = 1 dist = 2 63

  39. Breadth-first search public class BreadthFirstPaths { private boolean[] marked; private boolean[] edgeTo[]; private final int s; … private void bfs(Graph G, int s) { Queue<Integer> q = new Queue<Integer>(); q.enqueue(s); marked[s] = true; while (!q.isEmpty()) { int v = q.dequeue(); for (int w : G.adj(v)) { if (!marked[w]) { q.enqueue(w); marked[w] = true; edgeTo[w] = v; } } } } } 64

  40. U NDIRECTED G RAPHS ‣ Graph API ‣ Depth-first search ‣ Breadth-first search ‣ Connected components ‣ Challenges

  41. 
 
 
 
 
 
 
 
 
 
 
 Connectivity queries Def. Vertices v and w are connected if there is a path between them. Goal. Preprocess graph to answer queries: is v connected to w ? 
 in constant time. public class CC CC(Graph G) find connected components in G boolean connected(int v, int w) are v and w connected? int count() number of connected components component identifier for v 
 int id(int v) Depth-first search. [next few slides] 66

  42. 
 
 
 
 
 
 
 
 
 Connected components The relation "is connected to" is an equivalence relation: • Reflexive: v is connected to v . • Symmetric: if v is connected to w , then w is connected to v . • Transitive: if v connected to w and w connected to x , then v connected to x . Def. A connected component is a maximal set of connected vertices. v id[v] 0 0 
 1 0 7 8 0 2 0 
 3 0 4 0 
 1 2 6 5 0 9 10 6 0 
 7 1 3 4 8 1 11 12 9 2 5 10 2 11 2 3 connected components 12 2 Remark. Given connected components, can answer queries in constant time. 67

  43. Connected components Def. A connected component is a maximal set of connected vertices. 63 connected components 68

  44. Connected components Goal. Partition vertices into connected components. Connected components Initialize all vertices v as unmarked. For each unmarked vertex v, run DFS to identify all tinyG.txt vertices discovered as part of the same component. V 13 E 13 0 5 4 3 0 1 9 12 6 4 5 4 0 2 11 12 9 10 0 6 7 8 9 11 5 3 69

  45. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 0 0 7 7 8 8 7 8 0 F – 1 F – 2 F – 1 1 1 2 2 2 6 6 6 9 9 9 10 10 10 3 F – 4 F – 5 F – 3 3 3 4 4 4 11 11 11 12 12 12 6 F – 7 F – 8 F – 5 5 5 9 F – 10 F – 11 F – graph G 12 F – 70

  46. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 9 9 10 10 3 F – 4 F – 5 F – 3 3 4 4 11 11 12 12 6 F – 7 F – 8 F – 5 5 9 F – 10 F – 11 F – visit 0: check 6, check 2, check 1 and check 5 12 F – 71

  47. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 9 9 10 10 3 F – 4 F – 5 F – 3 3 4 4 11 11 12 12 6 T 0 7 F – 8 F – 5 5 9 F – 10 F – 11 F – visit 6: check 0 and check 4 12 F – 72

  48. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 6 9 9 10 10 3 F – 4 F – 5 F – 3 3 4 4 11 11 12 12 6 T 0 7 F – 8 F – 5 5 9 F – 10 F – 11 F – visit 6: check 0 and check 4 12 F – 73

  49. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 9 9 10 10 3 F – 4 T 0 5 F – 3 3 4 4 4 11 11 12 12 6 T 0 7 F – 8 F – 5 5 9 F – 10 F – 11 F – visit 4: check 5, check 6 and check 3 12 F – 74

  50. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 9 9 10 10 3 F – 4 T 0 5 T 0 3 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 5 5 9 F – 10 F – 11 F – visit 5: check 3, check 4 and check 0 12 F – 75

  51. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – visit 3: check 5 and check 4 12 F – 76

  52. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – visit 3: check 5 and check 4 12 F – 77

  53. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 5 9 F – 10 F – 11 F – 3 done 12 F – 78

  54. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 5 9 F – 10 F – 11 F – visit 5: check 3, check 4 and check 0 12 F – 79

  55. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 5 9 F – 10 F – 11 F – visit 5: check 3, check 4 and check 0 12 F – 80

  56. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 4 11 11 12 12 6 T 0 7 F – 8 F – 5 5 9 F – 10 F – 11 F – 5 done 12 F – 81

  57. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – visit 4: check 5, check 6 and check 3 12 F – 82

  58. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – visit 4: check 5, check 6 and check 3 12 F – 83

  59. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – 4 done 12 F – 84

  60. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – 6 done 12 F – 85

  61. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 0 7 8 7 8 0 T 0 1 F – 2 F – 1 1 2 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – visit 0: check 6, check 2, check 1 and check 5 12 F – 86

  62. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 F – 2 T 0 1 1 2 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – visit 2: check 0 12 F – 87

  63. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 0 7 8 7 8 0 T 0 1 F – 2 T 0 1 1 2 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – 2 done 12 F – 88

  64. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 0 7 8 7 8 0 T 0 1 F – 2 T 0 1 1 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – visit 0: check 6, check 2, check 1 and check 5 12 F – 89

  65. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 T 0 2 T 0 1 1 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – visit 1: check 0 12 F – 90

  66. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 0 7 8 7 8 0 T 0 1 T 0 2 T 0 1 1 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – 1 done 12 F – 91

  67. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 T 0 2 T 0 1 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – 0 done 12 F – 92

  68. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 connected 1 T 0 component 2 T 0 1 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – connected component: 0 1 2 3 4 5 6 12 F – 93

  69. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 T 0 2 T 0 1 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 F – 8 F – 5 9 F – 10 F – 11 F – check 1 2 3 4 5 6 12 F – 94

  70. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 T 0 2 T 0 1 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 T 1 8 F – 5 9 F – 10 F – 11 F – visit 7: check 8 12 F – 95

  71. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 T 0 2 T 0 1 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 T 1 8 T 1 5 9 F – 10 F – 11 F – visit 8: check 7 12 F – 96

  72. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 7 8 7 8 0 T 0 1 T 0 2 T 0 1 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 T 1 8 T 1 5 9 F – 10 F – 11 F – 8 done 12 F – 97

  73. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 7 8 0 T 0 1 T 0 2 T 0 1 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 T 1 8 T 1 5 9 F – 10 F – 11 F – 7 done 12 F – 98

  74. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 7 8 0 T 0 1 T 0 2 T 0 1 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 T 1 8 T 1 5 9 F – 10 F – 11 F – connected component: 7 8 12 F – 99

  75. Connected components To visit a vertex v : • Mark vertex v as visited. • Recursively visit all unmarked vertices adjacent to v . v marked[] cc[] 0 7 8 0 T 0 1 T 0 2 T 0 1 2 6 9 9 10 10 3 T 0 4 T 0 5 T 0 3 4 11 11 12 12 6 T 0 7 T 1 8 T 1 5 9 F – 10 F – 11 F – check 8 12 F – 100

Recommend


More recommend