Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set...

53
Graph Algorithms Searching

Transcript of Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set...

Page 1: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Graph Algorithms

Searching

Page 2: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Review: Graphs

● A graph G = (V, E)■ V = set of vertices, E = set of edges ■ Dense graph: |E| |V|2; Sparse graph: |E| |V|■ Undirected graph:

○ Edge (u,v) = Edge (v,u)○ No self-loops

■ Directed graph:○ Edge (u,v) goes from vertex u to vertex v, notated uv

■ A weighted graph associates weights with either the edges or the vertices

Page 3: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Review: Representing Graphs

● Assume V = {1, 2, …, n}● An adjacency matrix represents the graph as a

n x n matrix A:■ A[i, j] = 1 if edge (i, j) E (or weight of

edge)= 0 if edge (i, j) E

■ Storage requirements: O(|V|2) ○ A dense representation

● An adjacency list represents the graph as n lists of adjacent vertices■ Storage requirements: O(|V| + |E|)

Page 4: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Graph Searching

● Given: a graph G = (V, E), directed or undirected

● Goal: methodically explore every vertex and every edge

● Ultimately: build a tree on the graph■ Pick a vertex as the root (origin of search)■ Choose certain edges to produce a tree■ Note: might also build a forest if graph is not

connected

Page 5: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search

● “Explore” a graph, turning it into a tree■ One vertex at a time■ Expand frontier of explored vertices across the

breadth of the frontier

● Builds a tree over the graph■ Pick a source vertex to be the root■ Find (“discover”) its children, then their children,

etc.

Page 6: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search

● Associate vertex “colors” to guide the algorithm■ White vertices have not been discovered

○ All vertices start out white

■ Grey vertices are discovered but not fully explored○ They are enqueued

■ Black vertices are discovered and fully explored○ They are adjacent only to black and gray vertices○ Fully explored adjacency list fully processed

● Explore vertices by scanning adjacency list of grey vertices

Page 7: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search

BFS(G, s) { initialize vertices; // (For all v) [ v->color = WHITE, v->d = INF ] // s->color = GREY, s->d = 0 Q = {s}; // Q is a queue; initialize to s while (Q not empty) { u = RemoveFront(Q); for each v u->Adj[] { if (v->color == WHITE) v->color = GREY; v->d = u->d + 1; v->p = u; Enqueue(Q, v); } u->color = BLACK; }}

What does v->p represent?

What does v->d represent?

Page 8: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search: Example

r s t u

v w x y

Page 9: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search: Example

0

r s t u

v w x y

sQ:

Front

Page 10: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search: Example

1

0

1

r s t u

v w x y

wQ: r

r->p = s

Page 11: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search: Example

1

0

1

2

2

r s t u

v w x y

rQ: t x

Page 12: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search: Example

1

2

0

1

2

2

r s t u

v w x y

Q: t x v

Page 13: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search: Example

1

2

0

1

2

2

3

r s t u

v w x y

Q: x v u

Page 14: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search: Example

1

2

0

1

2

2

3

3

r s t u

v w x y

Q: v u y

Page 15: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search: Example

1

2

0

1

2

2

3

3

r s t u

v w x y

Q: u y

Page 16: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search: Example

1

2

0

1

2

2

3

3

r s t u

v w x y

Q: y

Page 17: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search: Example

1

2

0

1

2

2

3

3

r s t u

v w x y

Q: Ø

Page 18: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

BFS: The Code Again

BFS(G, s) { initialize vertices; Q = {s}; while (Q not empty) { u = RemoveTop(Q); for each v u->Adj[] { if (v->color == WHITE) v->color = GREY; v->d = u->d + 1; v->p = u; Enqueue(Q, v); } u->color = BLACK; }}

What will be the running time?

Touch every vertex: O(V)

u = every vertex, but only once (Why?)

So v = every vertex that appears in some other vert’s adjacency list

Total running time: O(V+E)

Page 19: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

BFS: The Code Again

BFS(G, s) { initialize vertices; Q = {s}; while (Q not empty) { u = RemoveTop(Q); for each v u->Adj[] { if (v->color == WHITE) v->color = GREY; v->d = u->d + 1; v->p = u; Enqueue(Q, v); } u->color = BLACK; }}

Page 20: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Breadth-First Search: Properties

● BFS calculates the shortest-path distance to the source node■ Shortest-path distance (s,v) = minimum number

of edges from s to v, or if v not reachable from s

● BFS builds breadth-first tree, in which paths to root represent shortest paths in G■ Thus can use BFS to calculate shortest path from

one vertex to another in O(V+E) time

Page 21: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

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 most recently discovered

vertex v that still has unexplored edges■ When all of v’s edges have been explored,

backtrack to vertex from which v was discovered

Page 22: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Depth-First Search

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

Page 23: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Depth-First Search: 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; u->d = time;

for each v u->Adj[] { if (v->color == WHITE) DFS_Visit(v); } u->color = BLACK; ++time; u->f = time;}

Page 24: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Depth-First Search: 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; u->d = time;

for each v u->Adj[] { if (v->color == WHITE) DFS_Visit(v); } u->color = BLACK; ++time; u->f = time;}

What does u->d represent?

Page 25: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Depth-First Search: 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; u->d = time;

for each v u->Adj[] { if (v->color == WHITE) DFS_Visit(v); } u->color = BLACK; ++time; u->f = time;}

What does u->f represent?

Page 26: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Depth-First Search: 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; u->d = time;

for each v u->Adj[] { if (v->color == WHITE) DFS_Visit(v); } u->color = BLACK; ++time; u->f = time;}

Will all vertices eventually be colored black?

Page 27: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Depth-First Search: 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; u->d = time;

for each v u->Adj[] { if (v->color == WHITE) DFS_Visit(v); } u->color = BLACK; ++time; u->f = time;}

What will be the running time?

Page 28: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Depth-First Search: 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; u->d = time;

for each v u->Adj[] { if (v->color == WHITE) DFS_Visit(v); } u->color = BLACK; ++time; 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 29: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Depth-First Search: 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; u->d = time;

for each v u->Adj[] { if (v->color == WHITE) DFS_Visit(v); } u->color = BLACK; ++time; u->f = time;}

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

Page 30: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Depth-First Search: 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; u->d = time;

for each v u->Adj[] { if (v->color == WHITE) DFS_Visit(v); } u->color = BLACK; ++time; u->f = time;}

So, running time of DFS = O(V+E)

Page 31: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

Depth-First Sort Analysis

● This running time argument is an informal example of amortized analysis■ “Charge” the exploration of edge to the edge

○ Each loop in DFS_Visit can be attributed to an edge in the graph

○ Runs once/edge if directed graph, twice if undirected○ Thus loop will run in O(E) time, algorithm O(V+E)

Considered linear for graph, b/c adj list requires O(V+E) storage

Page 32: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

sourcevertex

Page 33: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 | | |

| | |

| |

sourcevertex

d f

Page 34: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 | | |

| | |

2 | |

sourcevertex

d f

Page 35: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 | | |

| | 3 |

2 | |

sourcevertex

d f

Page 36: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 | | |

| | 3 | 4

2 | |

sourcevertex

d f

Page 37: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 | | |

| 5 | 3 | 4

2 | |

sourcevertex

d f

Page 38: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 | | |

| 5 | 63 | 4

2 | |

sourcevertex

d f

Page 39: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 | 8 | |

| 5 | 63 | 4

2 | 7 |

sourcevertex

d f

Page 40: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 | 8 | |

| 5 | 63 | 4

2 | 7 |

sourcevertex

d f

Page 41: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 | 8 | |

| 5 | 63 | 4

2 | 7 9 |

sourcevertex

d f

Page 42: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 | 8 | |

| 5 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 43: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 | 8 |11 |

| 5 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 44: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 |12 8 |11 |

| 5 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 45: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 |12 8 |11 13|

| 5 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 46: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 |12 8 |11 13|

14| 5 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 47: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 |12 8 |11 13|

14|155 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 48: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 |12 8 |11 13|16

14|155 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Page 49: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS: Kinds of edges

● DFS introduces an important distinction among edges in original graph■ Tree edge: encounter new (white) vertex

○ Form a spanning forest○ Can tree edges form cycles? Why or why not?

Page 50: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 |12 8 |11 13|16

14|155 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Tree edges

Page 51: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS: Kinds of edges

● DFS introduces an important distinction among edges in original graph■ Tree edge: encounter new (white) vertex ■ Back edge: from descendent to ancestor

○ Encounter a grey vertex (grey to grey)

Page 52: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS Example

1 |12 8 |11 13|16

14|155 | 63 | 4

2 | 7 9 |10

sourcevertex

d f

Tree edges Back edges

Page 53: Graph Algorithms Searching. Review: Graphs ● A graph G = (V, E) ■ V = set of vertices, E = set of edges ■ Dense graph: |E|  |V| 2 ; Sparse graph: |E|

DFS And Graph Cycles

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

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