350 likes | 393 Views
This guide delves into graph data structures, vertices, and edges, including essential methods like insertion, removal, and traversal. Learn about adjacency matrix and list structures, and delve into BFS and DFS algorithms for various applications such as cycle detection and spanning tree computation.
E N D
Graph Data Structures 1843 ORD SFO 802 1743 337 1233 LAX DFW Graphs
Vertices and edges are positions store elements Accessor methods endVertices(e): an array of the two endvertices of e opposite(v, e): the vertex opposite of v on e areAdjacent(v, w): true iff v and w are adjacent replace(v, x): replace element at vertex v with x replace(e, x): replace element at edge e with x Update methods insertVertex(o): insert a vertex storing element o insertEdge(v, w, o): insert an edge (v,w) storing element o removeVertex(v): remove vertex v (and its incident edges) removeEdge(e): remove edge e Iterable collection methods incidentEdges(v): edges incident to v vertices(): all vertices in the graph edges(): all edges in the graph Main Methods of the Graph ADT Graphs
Adjacency Matrix Structure a v b • Edge list structure • Augmented vertex objects • Integer key (index) associated with vertex • 2D-array adjacency array • Reference to edge object for adjacent vertices • Null for non nonadjacent vertices • The “old fashioned” version just has 0 for no edge and 1 for edge u w 2 w 0 u 1 v b a Graphs
Adjacency List Structure a v b • Incidence sequence for each vertex • sequence of references to edge objects of incident edges • Augmented edge objects • references to associated positions in incidence sequences of end vertices u w w u v b a Graphs
Performance Graphs
Applications of BFS and DFS CSE 2011 Winter 2011
Some Applications of BFS and DFS • BFS • To find the shortest path from a vertex s to a vertex v in an unweighted graph • To find the length of such a path • To find out if a graph contains cycles • To construct a BSF tree/forest from a graph • DFS • To find a path from a vertex s to a vertex v. • To find the length of such a path. • To construct a DSF tree/forest from a graph.
Testing for Cycles • Method isCyclic(v) returns true if a directed graph(with only one component) contains a cycle, and returns false otherwise. else return true; return false;
Finding Cycles • To output the cycle just detected, use info in prev[ ]. • NOTE: The code above applies only to directed graphs. • Homework: Explain why that code does not work for undirected graphs.
Finding Cycles in Undirected Graphs • To detect/find cycles in an undirected graph, we need to classify the edges into 3 categories during program execution: • unvisited edge: never visited. • discovery edge: visited for the very first time. • cross edge: edge that forms a cycle. • Code fragment 13.10, p. 623. • When the BFS algorithm terminates, the discovery edges form a spanning tree. • If there exists a cross edge, the undirected graph contains a cycle.
BFS Algorithm (in textbook) • The algorithm uses a mechanism for setting and getting “labels” of vertices and edges AlgorithmBFS(G, s) L0new empty sequence L0.insertLast(s) setLabel(s, VISITED) i 0 while Li.isEmpty() Li +1new empty sequence for all v Li.elements() for all e G.incidentEdges(v) ifgetLabel(e) = UNEXPLORED w opposite(v,e) if getLabel(w) = UNEXPLORED setLabel(e, DISCOVERY) setLabel(w, VISITED) Li +1.insertLast(w) else setLabel(e, CROSS) i i +1 AlgorithmBFS(G) Inputgraph G Outputlabeling of the edges and partition of the vertices of G for all u G.vertices() setLabel(u, UNEXPLORED) for all e G.edges() setLabel(e, UNEXPLORED) for all v G.vertices() ifgetLabel(v) = UNEXPLORED BFS(G, v) Breadth-First Search
L0 A L1 B C D E F Example unexplored vertex A visited vertex A unexplored edge discovery edge cross edge L0 L0 A A L1 L1 B C D B C D E F E F Breadth-First Search
L0 L0 A A L1 L1 B C D B C D L2 E F E F L0 L0 A A L1 L1 B C D B C D L2 L2 E F E F Example (2) Breadth-First Search
L0 L0 A A L1 L1 B C D B C D L2 L2 E F E F Example (3) L0 A L1 B C D L2 E F Breadth-First Search
Trees • Tree: a connected graph without cycles. • Given a connected graph, remove the cycles a tree. • The paths found by BFS(s) form a rooted tree (called a spanning tree), with the starting vertex as the root of the tree. BFS tree for vertex s = 2 What would a level-order traversal of the tree tell you?
Computing a BFS Tree • Use BFS on a vertex BFS( v ) with array prev[ ] • The paths from source s to the other vertices form a tree
Computing a BFS Forest • A forest is a set of trees. • A connected graph gives a tree (which is itself a forest). • A connected component also gives us a tree. • A graph with k components gives a forest of k trees.
Example A graph with 3 components P Q N L R O M s D E C A F B K G H
Example of a Forest We removed the cycles from the previous graph. P Q N L R O M s D E C A forest with 3 trees A F B K G H
Computing a BFS Forest • Use BFS method on a graph BFSearch( G ), which calls BFS( v ) • Use BFS( v ) with array prev[ ]. • The paths originating from v form a tree. • BFSearch( G ) examines all the components to compute all the trees in the forest.
Applications of DFS • Is there a path from source s to a vertex v? • Is an undirected graph connected? • Is a directed graph strongly connected? • To output the contents (e.g., the vertices) of a graph • To find the connected components of a graph • To find out if a graph contains cycles and report cycles. • To construct a DSF tree/forest from a graph
Finding Cycles Using DFS • Similar to using BFS. • For undirected graphs, classify the edges into 3 categories during program execution: unvisited edge, discovery edge, and back (cross) edge. • Code Fragment 13.1, p. 613. • If there exists a back edge, the undirected graph contains a cycle.
DFS Algorithm • The algorithm uses a mechanism for setting and getting “labels” of vertices and edges AlgorithmDFS(G, v) Inputgraph G and a start vertex v of G Outputlabeling of the edges of G in the connected component of v as discovery edges and back edges setLabel(v, VISITED) for all e G.incidentEdges(v) ifgetLabel(e) = UNEXPLORED w opposite(v,e) if getLabel(w) = UNEXPLORED setLabel(e, DISCOVERY) DFS(G, w) else setLabel(e, BACK) AlgorithmDFS(G) Inputgraph G Outputlabeling of the edges of G as discovery edges and back edges for all u G.vertices() setLabel(u, UNEXPLORED) for all e G.edges() setLabel(e, UNEXPLORED) for all v G.vertices() ifgetLabel(v) = UNEXPLORED DFS(G, v) Depth-First Search
A B D E C A A B D E B D E C C Example unexplored vertex A visited vertex A unexplored edge discovery edge back edge Depth-First Search
A A A B D E B D E B D E C C C A B D E C Example (cont.) Depth-First Search
DFS Tree Resulting DFS-tree. Notice it is much “deeper” than the BFS tree. Captures the structure of the recursive calls: • when we visit a neighbor w of v, we add w as child of v • whenever DFS returns from a vertex v, we climb up in the tree from v to its parent
Applications – DFS vs. BFS • What can BFS do and DFS can’t? • Finding shortest paths (in unweighted graphs) • What can DFS do and BFS can’t? • Finding out if a connected undirected graph is biconnected • A connected undirected graph is biconnected if there are no vertices whose removal disconnects the rest of the graph. • Application in computer networks: ensuring that a network is still connected when a router/link fails.
L0 A L1 B C D L2 E F DFS vs. BFS A B C D E F DFS BFS
Final Exam • Final Exam • Sunday, April 17, 10:00-13:00 • Materials: • All lectures notes and corresponding sections in the textbook from the beginning to today’s lecture • Homework questions • Assignments 1 to 5