csc 413/513: intro to algorithms

43
CSC 413/513: Intro to Algorithms Graph Algorithms DFS

Upload: april-harrison

Post on 01-Jan-2016

37 views

Category:

Documents


0 download

DESCRIPTION

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 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: CSC 413/513: Intro to Algorithms

CSC 413/513: Intro to Algorithms

Graph Algorithms

DFS

Page 2: CSC 413/513: Intro to Algorithms

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

Page 3: CSC 413/513: Intro to Algorithms

Depth-First Search

● Vertices initially colored white● Then colored gray when discovered● Then black when finished

Page 4: CSC 413/513: Intro to Algorithms

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;

}

Page 5: CSC 413/513: Intro to Algorithms

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;

}

What does u->d represent?

Page 6: CSC 413/513: Intro to Algorithms

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;

}

What does u->f represent?

Page 7: CSC 413/513: Intro to Algorithms

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;

}

Will all vertices eventually be colored black?

Page 8: CSC 413/513: Intro to Algorithms

DFS Example

sourcevertex

Page 9: CSC 413/513: Intro to Algorithms

DFS Example

1 | | |

| | |

| |

sourcevertex

d f

Page 10: CSC 413/513: Intro to Algorithms

DFS Example

1 | | |

| | |

2 | |

sourcevertex

d f

Page 11: CSC 413/513: Intro to Algorithms

DFS Example

1 | | |

| | 3 |

2 | |

sourcevertex

d f

Page 12: CSC 413/513: Intro to Algorithms

DFS Example

1 | | |

| | 3 | 4

2 | |

sourcevertex

d f

Page 13: CSC 413/513: Intro to Algorithms

DFS Example

1 | | |

| 5 | 3 | 4

2 | |

sourcevertex

d f

Page 14: CSC 413/513: Intro to Algorithms

DFS Example

1 | | |

| 5 | 63 | 4

2 | |

sourcevertex

d f

Page 15: CSC 413/513: Intro to Algorithms

DFS Example

1 | 8 | |

| 5 | 63 | 4

2 | 7 |

sourcevertex

d f

Page 16: CSC 413/513: Intro to Algorithms

DFS Example

1 | 8 | |

| 5 | 63 | 4

2 | 7 |

sourcevertex

d f

Page 17: CSC 413/513: Intro to Algorithms

DFS Example

1 | 8 | |

| 5 | 63 | 4

2 | 7 9 |

sourcevertex

d f

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

Page 18: CSC 413/513: Intro to Algorithms

DFS Example

1 | 8 | |

| 5 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 19: CSC 413/513: Intro to Algorithms

DFS Example

1 | 8 |11 |

| 5 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 20: CSC 413/513: Intro to Algorithms

DFS Example

1 |12 8 |11 |

| 5 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 21: CSC 413/513: Intro to Algorithms

DFS Example

1 |12 8 |11 13|

| 5 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 22: CSC 413/513: Intro to Algorithms

DFS Example

1 |12 8 |11 13|

14| 5 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 23: CSC 413/513: Intro to Algorithms

DFS Example

1 |12 8 |11 13|

14|155 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 24: CSC 413/513: Intro to Algorithms

DFS Example

1 |12 8 |11 13|16

14|155 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 25: CSC 413/513: Intro to Algorithms

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;

}

What will be the running time?

Page 26: CSC 413/513: Intro to Algorithms

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;

}Running time: O(n2) because call DFS_Visit on each vertex,

and the loop over Adj[] can run as many as |V| times

Page 27: CSC 413/513: Intro to Algorithms

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;

}BUT, there is actually a tighter bound.

How many times will DFS_Visit() actually be called?

Page 28: CSC 413/513: Intro to Algorithms

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

Page 29: CSC 413/513: Intro to Algorithms

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?

Page 30: CSC 413/513: Intro to Algorithms

DFS Example

1 |12 8 |11 13|16

14|155 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Tree edges

Page 31: CSC 413/513: Intro to Algorithms

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)

Page 32: CSC 413/513: Intro to Algorithms

DFS Example

1 |12 8 |11 13|16

14|155 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Tree edges Back edges

Page 33: CSC 413/513: Intro to Algorithms

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)

Page 34: CSC 413/513: Intro to Algorithms

DFS Example

1 |12 8 |11 13|16

14|155 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Tree edges Back edges Forward edges

Page 35: CSC 413/513: Intro to Algorithms

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

Page 36: CSC 413/513: Intro to Algorithms

DFS Example

1 |12 8 |11 13|16

14|155 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Tree edges Back edges Forward edges Cross edges

Page 37: CSC 413/513: Intro to Algorithms

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

Page 38: CSC 413/513: Intro to Algorithms

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?)

sourceF?

Page 39: CSC 413/513: Intro to Algorithms

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?

Page 40: CSC 413/513: Intro to Algorithms

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

Page 41: CSC 413/513: Intro to Algorithms

DFS And Cycles

● How would you modify the code to detect cycles?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;

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

Page 42: CSC 413/513: Intro to Algorithms

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;

}

Page 43: CSC 413/513: Intro to Algorithms

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