Csc 413 513 intro to algorithms
This presentation is the property of its rightful owner.
Sponsored Links
1 / 43

CSC 413/513: Intro to Algorithms PowerPoint PPT Presentation


  • 89 Views
  • Uploaded on
  • Presentation posted in: General

CSC 413/513: Intro to Algorithms. Graph Algorithms DFS. Depth-First Search. Depth-first search is another strategy for exploring a graph Explore “deeper” in the graph whenever possible Edges are explored out of the most recently discovered vertex v that still has unexplored edges

Download Presentation

CSC 413/513: Intro to Algorithms

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Csc 413 513 intro to algorithms

CSC 413/513: Intro to Algorithms

Graph Algorithms

DFS


Depth first search

Depth-First Search

  • Depth-first search is another strategy for exploring a graph

    • Explore “deeper” in the graph whenever possible

    • Edges are explored out of the most recently discovered vertex v that still has unexplored edges

    • When all of v’s edges have been explored, backtrack to the vertex from which v was discovered


Depth first search1

Depth-First Search

  • Vertices initially colored white

  • Then colored gray when discovered

  • Then black when finished


Depth first search the code

DFS(G)

{

for each vertex u  G->V

{

u->color = WHITE;

}

time = 0;

for each vertex u  G->V

{

if (u->color == WHITE)

DFS_Visit(u);

}

}

DFS_Visit(u)

{

u->color = GREY;

time = time+1;

u->d = time;

for each v  u->Adj[]

{

if (v->color == WHITE)

DFS_Visit(v);

}

u->color = BLACK;

time = time+1;

u->f = time;

}

Depth-First Search: The Code


Depth first search the code1

DFS(G)

{

for each vertex u  G->V

{

u->color = WHITE;

}

time = 0;

for each vertex u  G->V

{

if (u->color == WHITE)

DFS_Visit(u);

}

}

DFS_Visit(u)

{

u->color = GREY;

time = time+1;

u->d = time;

for each v  u->Adj[]

{

if (v->color == WHITE)

DFS_Visit(v);

}

u->color = BLACK;

time = time+1;

u->f = time;

}

Depth-First Search: The Code

What does u->d represent?


Depth first search the code2

DFS(G)

{

for each vertex u  G->V

{

u->color = WHITE;

}

time = 0;

for each vertex u  G->V

{

if (u->color == WHITE)

DFS_Visit(u);

}

}

DFS_Visit(u)

{

u->color = GREY;

time = time+1;

u->d = time;

for each v  u->Adj[]

{

if (v->color == WHITE)

DFS_Visit(v);

}

u->color = BLACK;

time = time+1;

u->f = time;

}

Depth-First Search: The Code

What does u->f represent?


Depth first search the code3

DFS(G)

{

for each vertex u  G->V

{

u->color = WHITE;

}

time = 0;

for each vertex u  G->V

{

if (u->color == WHITE)

DFS_Visit(u);

}

}

DFS_Visit(u)

{

u->color = GREY;

time = time+1;

u->d = time;

for each v  u->Adj[]

{

if (v->color == WHITE)

DFS_Visit(v);

}

u->color = BLACK;

time = time+1;

u->f = time;

}

Depth-First Search: The Code

Will all vertices eventually be colored black?


Dfs example

DFS Example

sourcevertex


Dfs example1

DFS Example

sourcevertex

d f

1 |

|

|

|

|

|

|

|


Dfs example2

DFS Example

sourcevertex

d f

1 |

|

|

2 |

|

|

|

|


Dfs example3

DFS Example

sourcevertex

d f

1 |

|

|

2 |

|

3 |

|

|


Dfs example4

DFS Example

sourcevertex

d f

1 |

|

|

2 |

|

3 | 4

|

|


Dfs example5

DFS Example

sourcevertex

d f

1 |

|

|

2 |

|

3 | 4

5 |

|


Dfs example6

DFS Example

sourcevertex

d f

1 |

|

|

2 |

|

3 | 4

5 | 6

|


Dfs example7

DFS Example

sourcevertex

d f

1 |

8 |

|

2 | 7

|

3 | 4

5 | 6

|


Dfs example8

DFS Example

sourcevertex

d f

1 |

8 |

|

2 | 7

|

3 | 4

5 | 6

|


Dfs example9

DFS Example

sourcevertex

d f

1 |

8 |

|

2 | 7

9 |

3 | 4

5 | 6

|

What is the structure of the grey vertices? What do they represent?


Dfs example10

DFS Example

sourcevertex

d f

1 |

8 |

|

2 | 7

9 |10

3 | 4

5 | 6

|


Dfs example11

DFS Example

sourcevertex

d f

1 |

8 |11

|

2 | 7

9 |10

3 | 4

5 | 6

|


Dfs example12

DFS Example

sourcevertex

d f

1 |12

8 |11

|

2 | 7

9 |10

3 | 4

5 | 6

|


Dfs example13

DFS Example

sourcevertex

d f

1 |12

8 |11

13|

2 | 7

9 |10

3 | 4

5 | 6

|


Dfs example14

DFS Example

sourcevertex

d f

1 |12

8 |11

13|

2 | 7

9 |10

3 | 4

5 | 6

14|


Dfs example15

DFS Example

sourcevertex

d f

1 |12

8 |11

13|

2 | 7

9 |10

3 | 4

5 | 6

14|15


Dfs example16

DFS Example

sourcevertex

d f

1 |12

8 |11

13|16

2 | 7

9 |10

3 | 4

5 | 6

14|15


Depth first search the code4

DFS(G)

{

for each vertex u  G->V

{

u->color = WHITE;

}

time = 0;

for each vertex u  G->V

{

if (u->color == WHITE)

DFS_Visit(u);

}

}

DFS_Visit(u)

{

u->color = GREY;

time = time+1;

u->d = time;

for each v  u->Adj[]

{

if (v->color == WHITE)

DFS_Visit(v);

}

u->color = BLACK;

time = time+1;

u->f = time;

}

Depth-First Search: The Code

What will be the running time?


Depth first search the code5

DFS(G)

{

for each vertex u  G->V

{

u->color = WHITE;

}

time = 0;

for each vertex u  G->V

{

if (u->color == WHITE)

DFS_Visit(u);

}

}

DFS_Visit(u)

{

u->color = GREY;

time = time+1;

u->d = time;

for each v  u->Adj[]

{

if (v->color == WHITE)

DFS_Visit(v);

}

u->color = BLACK;

time = time+1;

u->f = time;

}

Depth-First Search: The Code

Running time: O(n2) because call DFS_Visit on each vertex, and the loop over Adj[] can run as many as |V| times


Depth first search the code6

DFS(G)

{

for each vertex u  G->V

{

u->color = WHITE;

}

time = 0;

for each vertex u  G->V

{

if (u->color == WHITE)

DFS_Visit(u);

}

}

DFS_Visit(u)

{

u->color = GREY;

time = time+1;

u->d = time;

for each v  u->Adj[]

{

if (v->color == WHITE)

DFS_Visit(v);

}

u->color = BLACK;

time = time+1;

u->f = time;

}

Depth-First Search: The Code

BUT, there is actually a tighter bound. How many times will DFS_Visit() actually be called?


Depth first search analysis

Depth-First Search Analysis

  • For a node u

    • DFS_Visit(u) cannot be called more than once

    • DFS_Visit(u) cannot be called less than once

    • Therefore, exactly once

  • DFS_Visit(u) requires c + ϴ(|Adj(u)|) time

    • The fact that recursive calls are made to v’s is accounted for by DFS_Visit(v)

  • Total= ∑u ( c + ϴ(|Adj(u)|) ) = ϴ(V+E)

    • Considered linear in input size, since adjacency list is a ϴ(V+E) representation


Dfs kinds of edges

DFS: Kinds of edges

  • DFS introduces an important distinction among edges in the original graph:

    • Tree edge: encounter new (white) vertex

      • The tree edges form a spanning forest

      • Can tree edges form cycles? Why or why not?


Dfs example17

DFS Example

sourcevertex

d f

1 |12

8 |11

13|16

2 | 7

9 |10

3 | 4

5 | 6

14|15

Tree edges


Dfs kinds of edges1

DFS: Kinds of edges

  • DFS introduces an important distinction among edges in the original graph:

    • Tree edge: encounter new (white) vertex

    • Back edge: from descendent to ancestor

      • Encounter a grey vertex (grey to grey)


Dfs example18

DFS Example

sourcevertex

d f

1 |12

8 |11

13|16

2 | 7

9 |10

3 | 4

5 | 6

14|15

Tree edges

Back edges


Dfs kinds of edges2

DFS: Kinds of edges

  • DFS introduces an important distinction among edges in the original graph:

    • Tree edge: encounter new (white) vertex

    • Back edge: from descendent to ancestor

    • Forward edge: from ancestor to descendent

      • Not a tree edge, though

      • If forward edge, then grey node to black node

        • Converse not true; could be a cross edge (see next)


Dfs example19

DFS Example

sourcevertex

d f

1 |12

8 |11

13|16

2 | 7

9 |10

3 | 4

5 | 6

14|15

Tree edges

Back edges

Forward edges


Dfs kinds of edges3

DFS: Kinds of edges

  • DFS introduces an important distinction among edges in the original graph:

    • Tree edge: encounter new (white) vertex

    • Back edge: from descendent to ancestor

    • Forward edge: from ancestor to descendent

    • Cross edge: between or within trees

      • (Also) from a grey node to a black node

      • No ancestor-descendent relation, if in the same DFS tree


Dfs example20

DFS Example

sourcevertex

d f

1 |12

8 |11

13|16

2 | 7

9 |10

3 | 4

5 | 6

14|15

Tree edges

Back edges

Forward edges

Cross edges


Dfs kinds of edges4

DFS: Kinds of edges

  • DFS introduces an important distinction among edges in the original graph:

    • Tree edge: encounter new (white) vertex

    • Back edge: from descendent to ancestor

    • Forward edge: from ancestor to descendent

    • Cross edge: between a tree or subtrees

  • Note: tree & back edges are important; most algorithms don’t distinguish forward & cross


Dfs kinds of edges5

DFS: Kinds Of Edges

  • Thm 22.10: If G is undirected, a DFS produces only tree and back edges

  • Proof by contradiction:

    • Assume there’s a forward edge

      • But F? edge must actually be a back edge (why?)

source

F?


Dfs kinds of edges6

DFS: Kinds Of Edges

  • Thm 22.10: If G is undirected, a DFS produces only tree and back edges

  • Proof by contradiction:

    • Assume there’s a cross edge

      • But C? edge cannot be cross:

      • must be explored from one of the vertices it connects, becoming a treevertex, before other vertex is explored

      • So in fact the picture is wrong…bothlower tree edges cannot in fact betree edges

source

C?


Dfs and graph cycles

DFS And Graph Cycles

  • Thm: An undirected graph is acyclic iff a DFS yields no back edges

    • If acyclic, then no back edges (because a back edge implies a cycle)

    • If no back edges, then acyclic

      • No back edges implies only tree edges (Why?)

      • Only tree edges implies we have a tree or a forest

      • Which by definition is acyclic

  • Thus, can run DFS to find whether a graph has a cycle


Dfs and cycles

DFS And Cycles

  • How would you modify the code to detect cycles?

DFS_Visit(u)

{

u->color = GREY;

time = time+1;

u->d = time;

for each v  u->Adj[]

{

if (v->color == WHITE)

DFS_Visit(v);

}

u->color = BLACK;

time = time+1;

u->f = time;

}

DFS(G)

{

for each vertex u  G->V

{

u->color = WHITE;

}

time = 0;

for each vertex u  G->V

{

if (u->color == WHITE)

DFS_Visit(u);

}

}

If v->color == GREY and Pred(u)≠v, …


Dfs and cycles1

DFS And Cycles

  • What will be the running time?

DFS(G)

{

for each vertex u  G->V

{

u->color = WHITE;

}

time = 0;

for each vertex u  G->V

{

if (u->color == WHITE)

DFS_Visit(u);

}

}

DFS_Visit(u)

{

u->color = GREY;

time = time+1;

u->d = time;

for each v  u->Adj[]

{

if (v->color == WHITE)

DFS_Visit(v);

}

u->color = BLACK;

time = time+1;

u->f = time;

}


Dfs and cycles2

DFS And Cycles

  • What will be the running time?

  • A: O(V+E)

  • We can actually determine if cycles exist in O(V) time:

    • In an undirected acyclic forest, |E|  |V| - 1. So if no cycle, then O(V+E) is O(V)

    • If cycle, count the edges: if ever see |V| distinct edges, must have seen a back edge along the way

      • Can halt and output “cycle exists”

      • O(V) time


  • Login