1 Subgraphs A subgraph S of a graph G is a graph such that The vertices of S are a subset of the...

Post on 18-Jan-2016

236 views 0 download

Tags:

Transcript of 1 Subgraphs A subgraph S of a graph G is a graph such that The vertices of S are a subset of the...

1

SubgraphsA subgraph S of a graph G is a graph such that

The vertices of S are a subset of the vertices of G

The edges of S are a subset of the edges of G

A spanning subgraph of G is a subgraph that contains all the vertices of G

Subgraph

Spanning subgraph

2

Connectivity

A graph is connected if there is a path between every pair of verticesA connected component of a graph G is a maximal connected subgraph of G

Connected graph

Non connected graph with two connected components

3

Trees and ForestsA (free) tree is an undirected graph T such that

T is connected T has no cyclesThis definition of tree is

different from the one of a rooted tree

A forest is an undirected graph without cyclesThe connected components of a forest are trees

Tree

Forest

4

Spanning Trees and Forests

A spanning tree of a connected graph is a spanning subgraph that is a treeA spanning tree is not unique unless the graph is a treeSpanning trees have applications to the design of communication networksA spanning forest of a graph is a spanning subgraph that is a forest

Graph

Spanning tree

Breadth-First Search

Can be used to attempt to visit all nodes of a graph in a systematic mannerWorks with directed and undirected graphsWorks with weighted and unweighted graphs

A

HB

F

E

D

C

G

Overview

Task: Conduct a breadth-first search of the graph starting with node D

Each node has one of the three statuses: unvisited, visited (or discovered), processed

Breadth-first search starts with given node

0

A

HB

F

E

D

C

G

Overview

Nodes visited: D

Nodes processed:

Breadth-first search starts with given node

Then visits nodes adjacent in some specified order (e.g., alphabetical)

Like ripples in a pond

0

1

A

HB

F

E

D

C

G

Overview

Nodes visited: D, C

Nodes processed:

Breadth-first search starts with given node

Then visits nodes adjacent in some specified order (e.g., alphabetical)

Like ripples in a pond

0

1

A

HB

F

E

D

C

G

Overview

Nodes visited: D, C, E

Nodes processed:

Breadth-first search starts with given node

Then visits nodes adjacent in some specified order (e.g., alphabetical)

Like ripples in a pond

0

1

A

HB

F

E

D

C

G

Overview

Nodes visited: D, C, E, F

Nodes processed: D

Breadth-first search starts with given node

Then visits nodes adjacent in some specified order (e.g., alphabetical)

Like ripples in a pond

0

1

A

HB

F

E

D

C

G

Overview

Nodes visited: D, C, E, F, G

Nodes processed: D, C, E

When all nodes in ripple are visited, visit nodes in next ripples

0

2 1

A

HB

F

E

D

C

G

Overview

Nodes visited: D, C, E, F, G, H

Nodes processed: D, C, E, F, G

When all nodes in ripple are visited, visit nodes in next ripples

0

2 1

3

A

HB

F

E

D

C

G

Overview

Nodes visited: D, C, E, F, G, H, A

Nodes processed: D, C, E, F, G

When all nodes in ripple are visited, visit nodes in next ripples

0

2 1

3

4

A

HB

F

E

D

C

G

Overview

Nodes visited: D, C, E, F, G, H, A, B

Nodes processed: D, C, E, F, G, H, A, B

When all nodes in ripple are visited, visit nodes in next ripples

0

2 1

3

4

A

HB

F

E

D

C

G

Walk-ThroughEnqueued Array

A

B

C

D

E

F

G

H

How is this accomplished? Using a queue for visited but not yet processed nodes!

Rules: (1) Maintain an enqueued array. (2) Process node when dequeued.

Q :

A

HB

F

E

D

C

G

Walk-ThroughEnqueued Array

A

B

C

D √

E

F

G

H

Enqueue D. Notice, D not yet visited.

Q : D

Nodes visited:

A

HB

F

E

D

C

G

Walk-ThroughEnqueued Array

A

B

C √

D √

E √

F √

G

H

Dequeue D. Visit D. Enqueue unenqueued nodes adjacent to D.

Q : C E F

Nodes visited: D

A

HB

F

E

D

C

G

Walk-ThroughEnqueued Array

A

B

C √

D √

E √

F √

G

H

Dequeue C. Visit C. Enqueue unenqueued nodes adjacent to C.

Q : E F

Nodes visited: D, C

A

HB

F

E

D

C

G

Walk-ThroughEnqueued Array

A

B

C √

D √

E √

F √

G

H

Dequeue E. Visit E. Enqueue unenqueued nodes adjacent to E.

Q : F G

Nodes visited: D, C, E

A

HB

F

E

D

C

G

Walk-ThroughEnqueued Array

A

B

C √

D √

E √

F √

G √

H

Dequeue F. Visit F. Enqueue unenqueued nodes adjacent to F.

Q : G

Nodes visited: D, C, E, F

A

HB

F

E

D

C

G

Walk-ThroughEnqueued Array

A

B

C √

D √

E √

F √

G √

H √

Dequeue G. Visit G. Enqueue unenqueued nodes adjacent to G.

Q : H

Nodes visited: D, C, E, F, G

A

HB

F

E

D

C

G

Walk-ThroughEnqueued Array

A √

B √

C √

D √

E √

F √

G √

H √

Dequeue H. Visit H. Enqueue unenqueued nodes adjacent to H.

Q : A B

Nodes visited: D, C, E, F, G, H

A

HB

F

E

D

C

G

Walk-ThroughEnqueued Array

A √

B √

C √

D √

E √

F √

G √

H √

Dequeue A. Visit A. Enqueue unenqueued nodes adjacent to A.

Q : B

Nodes visited: D, C, E, F, G, H, A

A

HB

F

E

D

C

G

Walk-ThroughEnqueued Array

A √

B √

C √

D √

E √

F √

G √

H √

Dequeue B. Visit B. Enqueue unenqueued nodes adjacent to B.

Q : (empty)

Nodes visited: D, C, E, F, G, H, A, B

A

HB

F

E

D

C

G

Walk-ThroughEnqueued Array

A √

B √

C √

D √

E √

F √

G √

H √

Q empty. Algorithm done.

Q is empty

Nodes visited: D, C, E, F, G, H, A, B

Consider Trees1. What do we call a breadth-first traversal on

trees?

2. If we consider only each edge (u, v) where node v is visited for the first time by DFS from node u. What do we call the subgraph consisted of these edges?

Consider Trees1. What do we call a breadth-first traversal on

trees? Preorder traversal

2. If we consider only each edge (u, v) where node v is visited for the first time by BFS from node u. What do we call the subgraph consisted of these edges? The BFS tree.

A

HB

F

E

D

C

G

Depth-First Search

Also called Depth-First SearchCan be used to attempt to visit all nodes of a graph in a systematic mannerWorks with directed and undirected graphsWorks with weighted and unweighted graphs

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A

B

C

D

E

F

G

H

Task: Conduct a depth-first search of the graph starting with node D

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A

B

C

D √

E

F

G

H

Visit D

DThe order nodes are visited:

D

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A

B

C

D √

E

F

G

H

Consider nodes adjacent to D, decide to visit C first (Rule:

visit adjacent nodes in alphabetical order)

DThe order nodes are visited:

D

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A

B

C √

D √

E

F

G

H

Visit C

C

DThe order nodes are visited:

D, C

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A

B

C √

D √

E

F

G

H

No nodes adjacent to C; cannot continue backtrack, i.e.,

pop stack and restore previous state

C

DThe order nodes are visited:

D, C

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A

B

C √

D √

E

F

G

H

Back to D – C has been visited, decide to visit E next

DThe order nodes are visited:

D, C

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A

B

C √

D √

E √

F

G

H

Back to D – C has been visited, decide to visit E next

E

DThe order nodes are visited:

D, C, E

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A

B

C √

D √

E √

F

G

H

Only G is adjacent to E

E

DThe order nodes are visited:

D, C, E

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A

B

C √

D √

E √

F

G √

H

Visit G

G

E

DThe order nodes are visited:

D, C, E, G

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A

B

C √

D √

E √

F

G √

H

Nodes D and H are adjacent to G. D has already been

visited. Decide to visit H.

G

E

DThe order nodes are visited:

D, C, E, G

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A

B

C √

D √

E √

F

G √

H √

Visit H

H

G

E

DThe order nodes are visited:

D, C, E, G, H

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A

B

C √

D √

E √

F

G √

H √

Nodes A and B are adjacent to F. Decide to visit A next.

H

G

E

DThe order nodes are visited:

D, C, E, G, H

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A √

B

C √

D √

E √

F

G √

H √

Visit A

A

H

G

E

DThe order nodes are visited:

D, C, E, G, H, A

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A √

B

C √

D √

E √

F

G √

H √

Only Node B is adjacent to A. Decide to visit B next.

A

H

G

E

DThe order nodes are visited:

D, C, E, G, H, A

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A √

B √

C √

D √

E √

F

G √

H √

Visit B

B

A

H

G

E

DThe order nodes are visited:

D, C, E, G, H, A, B

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A √

B √

C √

D √

E √

F

G √

H √

No unvisited nodes adjacent to B. Backtrack (pop the stack).

A

H

G

E

DThe order nodes are visited:

D, C, E, G, H, A, B

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A √

B √

C √

D √

E √

F

G √

H √

No unvisited nodes adjacent to A. Backtrack (pop the stack).

H

G

E

DThe order nodes are visited:

D, C, E, G, H, A, B

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A √

B √

C √

D √

E √

F

G √

H √

No unvisited nodes adjacent to H. Backtrack (pop the

stack).

G

E

DThe order nodes are visited:

D, C, E, G, H, A, B

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A √

B √

C √

D √

E √

F

G √

H √

No unvisited nodes adjacent to G. Backtrack (pop the

stack).

E

DThe order nodes are visited:

D, C, E, G, H, A, B

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A √

B √

C √

D √

E √

F

G √

H √

No unvisited nodes adjacent to E. Backtrack (pop the stack).

DThe order nodes are visited:

D, C, E, G, H, A, B

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A √

B √

C √

D √

E √

F

G √

H √

F is unvisited and is adjacent to D. Decide to visit F next.

DThe order nodes are visited:

D, C, E, G, H, A, B

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A √

B √

C √

D √

E √

F √

G √

H √

Visit F

F

DThe order nodes are visited:

D, C, E, G, H, A, B, F

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A √

B √

C √

D √

E √

F √

G √

H √

No unvisited nodes adjacent to F. Backtrack.

DThe order nodes are visited:

D, C, E, G, H, A, B, F

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A √

B √

C √

D √

E √

F √

G √

H √

No unvisited nodes adjacent to D. Backtrack.

The order nodes are visited:

D, C, E, G, H, A, B, F

A

HB

F

E

D

C

G

Walk-ThroughVisited Array

A √

B √

C √

D √

E √

F √

G √

H √

Stack is empty. Depth-first traversal is done.

The order nodes are visited:

D, C, E, G, H, A, B, F

54

Depth-First SearchDepth-first search (DFS) is a general technique for traversing a graphA DFS traversal of a graph G

Visits all the vertices and edges of G

Determines whether G is connected

Computes the connected components of G

Computes a spanning forest of G

DFS on a graph with n vertices and m edges takes O(nm ) timeDFS can be further extended to solve other graph problems

Find and report a path between two given vertices

Find a cycle in the graph

55

DFS AlgorithmThe algorithm uses a mechanism for setting and getting “labels” of vertices and edges

Algorithm DFS(G, v)Input graph G and a start vertex v of G Output labeling 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)

if getLabel(e) UNEXPLOREDw opposite(v,e)if getLabel(w) UNVISITED

setLabel(e, DISCOVERY)DFS(G, w)

else if getLabel(w) VISITEDsetLabel(e, BACK)

else // getLabel(w) PROCESSED

setLabel(e, CROSS)setLabel(u, PROCESSED)

Algorithm DFS(G)Input graph GOutput labeling of the edges of G

as discovery edges andback edges

for all u G.vertices()setLabel(u, UNVISITED)

for all e G.edges()setLabel(e, UNEXPLORED)

for all v G.vertices()if getLabel(v) UNVISITED

DFS(G, v)

56

Example (undirected graph)

DB

A

C

E

DB

A

C

E

DB

A

C

E

discovery edgeback edge

A visited vertex

A unvisited vertex

unexplored edge

57

Example (cont.)

DB

A

C

E

DB

A

C

E

DB

A

C

E

DB

A

C

E

A

HB

F

E

D

C

G

Classify edges by DFS

The order nodes are visited:

D, C, E, G, H, A, B, F

discovery edge

back edge

cross edge

(H,B) is labeled as CROSS, but it is a FORWARD edge.

Classification of Edges of G with Spanning Tree T

An edge (u,v) of T is tree edgeAn edge (u,v) of G-T is back edge if u is a descendent of v.An edge (u,v) of G-T is forward edge if u is an ancestor of v.Else (u,v) is a cross edge

Classification of Edges of G via DFS Spanning Tree T

1

6

2

4

3

5

7

8

G

1

6

2

4

3

5

7

8

T

Classification of Edges of G via DFS Spanning Tree T

DFS tree T in an undirected graph has no cross or forward edges

62

DFS and Maze Traversal The DFS algorithm is similar to a classic strategy for exploring a maze

We mark each intersection, corner and dead end (vertex) visited

We mark each corridor (edge ) traversed

We keep track of the path back to the entrance (start vertex) by means of a rope (recursion stack)

63

Properties of DFS

Property 1DFS(G, v) visits all the vertices and edges in the connected component of v

Property 2The discovery edges labeled by DFS(G, v) form a spanning tree of the connected component of v

DB

A

C

E

64

Analysis of DFSSetting/getting a vertex/edge label takes O(1) timeEach vertex is labeled twice

once as UNVISITED once as VISITED once as PROCESSED

Each edge is labeled twice once as UNEXPLORED once as DISCOVERY or BACK or CROSS

Method incidentEdges is called once for each vertexDFS runs in O(n m) time provided the graph is represented by the adjacency list structure

Note that v deg(v) 2m

65

Path FindingWe can specialize the DFS algorithm to find a path between two given vertices u and z using the template method patternWe call DFS(G, u) with u as the start vertexWe use a stack S to keep track of the path between the start vertex and the current vertexAs soon as destination vertex z is encountered, we return the path as the contents of the stack

Algorithm pathDFS(G, v, z)setLabel(v, VISITED)S.push(v)if v z

return S.elements()for all e G.incidentEdges(v)

if getLabel(e) UNEXPLORED

w opposite(v,e)if getLabel(w)

UNEXPLORED setLabel(e, DISCOVERY)S.push(e)pathDFS(G, w, z)S.pop(e)

else setLabel(e, BACK)

S.pop(v)

66

Cycle FindingWe can specialize the DFS algorithm to find a simple cycle using the template method patternWe use a stack S to keep track of the path between the start vertex and the current vertex

As soon as a back edge (v, w) is encountered, we return the cycle as the portion of the stack from the top to vertex w

Algorithm cycleDFS(G, v, z)setLabel(v, VISITED)S.push(v)for all e G.incidentEdges(v)

if getLabel(e) UNEXPLOREDw opposite(v,e)S.push(e)if getLabel(w) UNEXPLORED

setLabel(e, DISCOVERY)pathDFS(G, w, z)S.pop(e)

elseT new empty stackrepeat

o S.pop()T.push(o)

until o wreturn T.elements()

S.pop(v)