Directed Graph Algorithms

Directed Graph Algorithms

<p>Directed Graph Algorithms </p><p>CSE 373 <br>Data Structures </p><p>Readings </p><p>• Reading&nbsp;Chapter 13 </p><p>› Sections&nbsp;13.3 and 13.4 </p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">2</li></ul><p></p><p>Topological Sort </p><p>142 <br>322 <br>143 <br>321 </p><p>Problem: Find an order in which all these courses can be taken. </p><p>326 <br>370 <br>341 </p><p>Example: 142 Æ 143 Æ 378 Æ 370 Æ 321 Æ 341 Æ 322 Æ 326 Æ 421 Æ 401 </p><p>378 <br>421 </p><p>401 </p><p>In order to take a course, you must take all of its prerequisites first </p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">3</li></ul><p></p><p>Topological Sort </p><p>Given a digraph <em>G </em>= (<em>V</em>, <em>E</em>), find a linear ordering of its vertices such that: </p><p>for any edge (<em>v, w</em>) in <em>E</em>, <em>v </em>precedes <em>w </em>in the ordering </p><p>B<br>C</p><p>A</p><p>F</p><p>D<br>E</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">4</li></ul><p></p><p>Topo sort – valid solution </p><p>B<br>C</p><p>Any linear ordering in which all the arrows go to the right </p><p>A</p><p>F is a valid solution </p><p>D<br>E</p><p></p><ul style="display: flex;"><li style="flex:1">A</li><li style="flex:1">F</li><li style="flex:1">D E </li><li style="flex:1">B</li><li style="flex:1">C</li></ul><p></p><p>Note that F can go anywhere in this list because it is not connected. <br>Also the solution is not unique. </p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">5</li></ul><p></p><p>Topo sort – invalid solution </p><p>B<br>C</p><p>Any linear ordering in which an arrow goes to the left is not a valid solution </p><p>A<br>F</p><p>D<br>E</p><p></p><ul style="display: flex;"><li style="flex:1">A</li><li style="flex:1">F</li><li style="flex:1">E D </li></ul><p></p><p>NO! </p><p></p><ul style="display: flex;"><li style="flex:1">B</li><li style="flex:1">C</li></ul><p></p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">6</li></ul><p></p><p>Paths and Cycles </p><p>• Given&nbsp;a digraph G = (V,E), a path is a sequence of vertices v<sub style="top: 0.665em;">1</sub>,v<sub style="top: 0.665em;">2</sub>, …,v<sub style="top: 0.665em;">k </sub>such that: </p><p>› (v<sub style="top: 0.585em;">i</sub>,v<sub style="top: 0.585em;">i+1</sub>) in E for 1 &lt; i &lt; k › path&nbsp;length = number of edges in the path › path&nbsp;cost = sum of costs of each edge </p><p>• A&nbsp;path is a cycle if : </p><p>› k&nbsp;&gt; 1; v<sub style="top: 0.585em;">1 </sub>= v<sub style="top: 0.585em;">k </sub></p><p>• G&nbsp;is acyclic if it has no cycles. </p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">7</li></ul><p></p><p>Only acyclic graphs can be topo. sorted </p><p>• A&nbsp;directed graph with a cycle cannot be topologically sorted. </p><p>B<br>C</p><p>A</p><p>F</p><p>D<br>E</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">8</li></ul><p></p><p>Topo sort algorithm - 1 </p><p>Step 1: Identify vertices that have no incoming edges </p><p>• The “in-degree” of these vertices is zero </p><p>B<br>C<br>A</p><p>F</p><p>D<br>E</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">9</li></ul><p></p><p>Topo sort algorithm - 1a </p><p>Step 1: Identify vertices that have no incoming edges </p><p>• If <em>no such vertices</em>, graph has only cycle(s) (cyclic graph) • Topological sort not possible – Halt. </p><p>B<br>C<br>A</p><p>Example of a cyclic graph </p><p>D</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">10 </li></ul><p></p><p>Topo sort algorithm - 1b </p><p>Step 1: Identify vertices that have no incoming edges </p><p>• Select one such vertex </p><p>Select <br>B<br>C<br>A</p><p>F</p><p>D<br>E</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">11 </li></ul><p></p><p>Topo sort algorithm - 2 </p><p>Step 2: Delete this vertex of in-degree 0 and all its outgoing edges from the graph. Place it in the output. </p><p>B<br>C<br>A</p><p>A<br>F</p><p>D<br>E</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">12 </li></ul><p></p><p>Continue until done </p><p>Repeat Step 1 and Step 2 until graph is empty </p><p>Select <br>B<br>C</p><p>A<br>F</p><p>D<br>E</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">13 </li></ul><p></p><p>B</p><p>Select B.&nbsp;Copy to sorted list.&nbsp;Delete B and its edges. </p><p>B<br>C</p><p>A B <br>F</p><p>D<br>E</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">14 </li></ul><p></p><p>C</p><p>Select C.&nbsp;Copy to sorted list.&nbsp;Delete C and its edges. </p><p>C<br>A B C <br>F</p><p>D<br>E</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">15 </li></ul><p></p><p>D</p><p>Select D.&nbsp;Copy to sorted list.&nbsp;Delete D and its edges. </p><p></p><ul style="display: flex;"><li style="flex:1">D</li><li style="flex:1">A B C </li></ul><p>F</p><p>D<br>E</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">16 </li></ul><p></p><p>E, F </p><p>Select E.&nbsp;Copy to sorted list.&nbsp;Delete E and its edges. Select F.&nbsp;Copy to sorted list.&nbsp;Delete F and its edges. </p><p></p><ul style="display: flex;"><li style="flex:1">D</li><li style="flex:1">A B C </li><li style="flex:1">E F </li></ul><p>F</p><p>E</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">17 </li></ul><p></p><p>Done </p><p>B<br>C<br>A</p><p>F</p><p>D<br>E</p><p></p><ul style="display: flex;"><li style="flex:1">D</li><li style="flex:1">A B C </li><li style="flex:1">E F </li></ul><p></p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">18 </li></ul><p></p><p>Implementation </p><p>Assume adjacency list representation </p><p>B<br>1</p><p>23456<br>23<br>4<br>C</p><p>A</p><p>F<br>5<br>4</p><p>5<br>D<br>E</p><p>value next </p><p>Translation array </p><p>1 2 3 4 5 6 A B C D E F </p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">19 </li></ul><p></p><p>Calculate In-degrees </p><p>D</p><p>011220</p><p>A</p><p>123456<br>23<br>45<br>4</p><p>5</p><p>In-Degree array; or add a field to array A </p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">20 </li></ul><p></p><p>Calculate In-degrees </p><p>for i = 1 to n do D[i] := 0; endfor for i = 1 to n do x := A[i]; while x ≠ null do </p><p>D[x.value] := D[x.value] + 1; x := x.next; endwhile endfor </p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">21 </li></ul><p></p><p>Maintaining Degree 0 Vertices </p><p>Key idea: Initialize and maintain a <em>queue (or stack) </em>of vertices with In-Degree 0 </p><p>D</p><p>011220</p><p>A</p><p>123456<br>23<br>45</p><p><strong>Queue </strong></p><p>1 6 <br>45<br>24<br>3<br>6<br>1</p><p>5</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">22 </li></ul><p></p><p>Topo Sort using a Queue <br>(breadth-first) </p><p>After each vertex is output, when updating In-Degree array, </p><p><em>enqueue any vertex whose In-Degree becomes zero </em></p><p>D</p><p>001120</p><p>A</p><p>6 2 </p><p><strong>Queue </strong></p><p>123456<br>23<br>45</p><p>dequeue enqueue </p><p><strong>Output </strong></p><p>1<br>45<br>2<br>3</p><p>6<br>1</p><p>4<br>5</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">23 </li></ul><p></p><p>Topological Sort Algorithm </p><p>1. Store&nbsp;each vertex’s In-Degree in an array D 2. Initialize&nbsp;queue with all “in-degree=0” vertices 3. While&nbsp;there are vertices remaining in the queue: </p><p>(a) Dequeue and output a vertex (b) Reduce In-Degree of all vertices adjacent to it by 1 (c) Enqueue any of these vertices whose In-Degree became zero </p><p>4. If&nbsp;all vertices are output then success, otherwise there is a cycle. </p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">24 </li></ul><p></p><p>Some Detail </p><p>Main Loop while notEmpty(Q) do x := Dequeue(Q) Output(x) y := A[x]; while y ≠ null do </p><p>D[y.value] := D[y.value] – 1; if D[y.value] = 0 then Enqueue(Q,y.value); y := y.next; endwhile endwhile </p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">25 </li></ul><p></p><p>Topological Sort Analysis </p><p>• Initialize&nbsp;In-Degree array: O(|V| + |E|) • Initialize&nbsp;Queue with In-Degree 0 vertices: O(|V|) • Dequeue&nbsp;and output vertex: <br>› |V|&nbsp;vertices, each takes only O(1) to dequeue and output: O(|V|) </p><p>• Reduce&nbsp;In-Degree of all vertices adjacent to a vertex and Enqueue any In-Degree 0 vertices: </p><p>› O(|E|) <br>• For&nbsp;input graph G=(V,E) run time&nbsp;= O(|V|&nbsp;+ |E|) <br>› Linear&nbsp;time! </p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">26 </li></ul><p></p><p>Topo Sort using a Stack <br>(depth-first) </p><p>After each vertex is output, when updating In-Degree array, </p><p><em>push any vertex whose In-Degree becomes zero </em></p><p>D</p><p>001120</p><p>A</p><p>2 6 </p><p><strong>Stack </strong></p><p>123456<br>23<br>45</p><p>pop push </p><p><strong>Output </strong></p><p>1<br>45<br>2<br>3</p><p>6<br>1</p><p>4<br>5</p><p></p><ul style="display: flex;"><li style="flex:1">Digraphs </li><li style="flex:1">27 </li></ul><p></p>

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    27 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us