Graphs Carola Wenk Slides courtesy of Charles Leiserson with - - PowerPoint PPT Presentation

graphs
SMART_READER_LITE
LIVE PREVIEW

Graphs Carola Wenk Slides courtesy of Charles Leiserson with - - PowerPoint PPT Presentation

CMPS 6610/4610 Fall 2016 Graphs Carola Wenk Slides courtesy of Charles Leiserson with changes and additions by Carola Wenk CMPS 6610/4610 Fall 2016 1 Graphs Definition. A directed graph ( digraph ) G = ( V , E ) is an ordered pair


slide-1
SLIDE 1

CMPS 6610/4610 – Fall 2016 1

CMPS 6610/4610 – Fall 2016

Graphs

Carola Wenk

Slides courtesy of Charles Leiserson with changes and additions by Carola Wenk

slide-2
SLIDE 2

CMPS 6610/4610 – Fall 2016 2

Graphs

  • Definition. A directed graph (digraph) G = (V,

E) is an ordered pair consisting of

  • a set V of vertices (singular: vertex),
  • a set E  V  V of edges.

In an undirected graph G = (V, E), the edge set E consists of unordered pairs of vertices. In either case, we have | E | = O(|V| 2). Moreover, if G is connected, then | E |  | V | – 1.

2 1 3 4 2 1 3 4

directed graph undirected graph

slide-3
SLIDE 3

CMPS 6610/4610 – Fall 2016 3

Adjacency-matrix representation

The adjacency matrix of a graph G = (V, E), where V = {1, 2, …, n}, is the matrix A[1 . . n, 1 . . n] given by A[i, j] = 1 if (i, j)  E, 0 if (i, j)  E. 2 1 3 4 A 1 2 3 4 1 2 3 4 1 1 1 1 1 (|V| 2) storage  dense representation.

slide-4
SLIDE 4

CMPS 6610/4610 – Fall 2016 4

Adjacency-list representation

An adjacency list of a vertex v  V is the list Adj[v]

  • f vertices adjacent to v.

2 1 3 4

Adj[1] = {2, 3} Adj[2] = {3} Adj[3] = {} Adj[4] = {3, 4}

For undirected graphs, |Adj[v]| = degree(v). For digraphs, | Adj[v] | = out-degree(v).

slide-5
SLIDE 5

CMPS 6610/4610 – Fall 2016 5

Adjacency-list representation

Handshaking Lemma:

Every edge is counted twice

  • For undirected graphs:

vV degree(v) = 2|E|

  • For digraphs:

vV in-degree(v) = vV out-degree(v) = | E |  adjacency lists use (|V| + |E|) storage  a sparse representation  We usually use this representation, unless stated otherwise

slide-6
SLIDE 6

CMPS 6610/4610 – Fall 2016 6

Graph Traversal

Let G=(V,E) be a (directed or undirected) graph, given in adjacency list representation. |V| = n , |E| = m A graph traversal visits every vertex:

  • Breadth-first search (BFS)
  • Depth-first search (DFS)
slide-7
SLIDE 7

CMPS 6610/4610 – Fall 2016 7

Breadth-First Search (BFS)

BFS(G=(V,E)) Mark all vertices in G as “unvisited” // time=0 Initialize empty queue Q for each vertex v  V do if v is unvisited visit v // time++ Q.enqueue(v) BFS_iter(G) BFS_iter(G) while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w)

slide-8
SLIDE 8

CMPS 6610/4610 – Fall 2016 8

Example of breadth-first search

a b c d e f g i h Q:

while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w)

slide-9
SLIDE 9

CMPS 6610/4610 – Fall 2016 9

Example of breadth-first search

a b c d e f g i h Q: a

while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w)

slide-10
SLIDE 10

CMPS 6610/4610 – Fall 2016 10

Example of breadth-first search

a b c d e f g i h Q: a b d

1 2 1 2

while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w)

slide-11
SLIDE 11

CMPS 6610/4610 – Fall 2016 11

Example of breadth-first search

a b c d e f g i h Q: a b d c e

1 2 3 4 2 3 4

while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w)

slide-12
SLIDE 12

CMPS 6610/4610 – Fall 2016 12

Example of breadth-first search

a b c d e f g i h Q: a b d c e

1 2 3 4 3 4

while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w)

slide-13
SLIDE 13

CMPS 6610/4610 – Fall 2016 13

Example of breadth-first search

a b c d e f g i h Q: a b d c e

1 2 3 4 4

while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w)

slide-14
SLIDE 14

CMPS 6610/4610 – Fall 2016 14

Example of breadth-first search

a b c d e f g i h Q: a b d c e f g

1 2 3 4 5 6 5 6

while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w)

slide-15
SLIDE 15

CMPS 6610/4610 – Fall 2016 15

Example of breadth-first search

a b c d e f g i h Q: a b d c e f g i

1 2 3 4 5 6 7 6 7

while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w)

slide-16
SLIDE 16

CMPS 6610/4610 – Fall 2016 16

Example of breadth-first search

a b c d e f g i h Q: a b d c e f g i h

1 2 3 4 5 6 7 8 7 8

a a

while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w)

slide-17
SLIDE 17

CMPS 6610/4610 – Fall 2016 17

Example of breadth-first search

a b c d e f g i h Q: a b d c e f g i h

1 2 3 4 5 6 7 8 8

a a

while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w)

slide-18
SLIDE 18

CMPS 6610/4610 – Fall 2016 18

Example of breadth-first search

a b c d e f g i h Q: a b d c e f g i h

1 2 3 4 5 6 7 8

a a

while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w)

slide-19
SLIDE 19

CMPS 6610/4610 – Fall 2016 19

Example of breadth-first search

a b c d e f g i h Q: a b d c e f g i h

1 2 3 4 5 6 7 8

a a

while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w)

Distance to a: 1 2 3 4

slide-20
SLIDE 20

CMPS 6610/4610 – Fall 2016 20

Breadth-First Search (BFS)

BFS(G=(V,E)) Mark all vertices in G as “unvisited” // time=0 Initialize empty queue Q for each vertex v  V do if v is unvisited visit v // time++ Q.enqueue(v) BFS_iter(G) BFS_iter(G) while Q is non-empty do v = Q.dequeue() for each w adjacent to v do if w is unvisited visit w // time++ Add edge (v,w) to T Q.enqueue(w) O(n) O(1) O(n)

without BFS_iter

O(deg(v)) O(m)

slide-21
SLIDE 21

CMPS 6610/4610 – Fall 2016 21

BFS runtime

  • Each vertex is marked as unvisited in the beginning  O(n) time
  • Each vertex is marked at most once, enqueued at most once,

and therefore dequeued at most once

  • The time to process a vertex is proportional to the size of its

adjacency list (its degree), since the graph is given in adjacency list representation  O(m) time

  • Total runtime is O(n+m) = O(|V| + |E|)
slide-22
SLIDE 22

CMPS 6610/4610 – Fall 2016 22

Depth-First Search (DFS)

DFS(G=(V,E)) Mark all vertices in G as “unvisited” // time=0 for each vertex v  V do if v is unvisited DFS_rec(G,v) DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-23
SLIDE 23

CMPS 6610/4610 – Fall 2016 23

Example of depth-first search

a b c d e f g i h

0/- d / f

a : a b c d e f g h i a

  • Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-24
SLIDE 24

CMPS 6610/4610 – Fall 2016 24

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

  • Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-25
SLIDE 25

CMPS 6610/4610 – Fall 2016 25

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/- 2/3

  • Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-26
SLIDE 26

CMPS 6610/4610 – Fall 2016 26

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/3

b

  • Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-27
SLIDE 27

CMPS 6610/4610 – Fall 2016 27

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/3 4/-

b e

  • Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-28
SLIDE 28

CMPS 6610/4610 – Fall 2016 28

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/3 4/-

b

5/-

f

  • e

Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-29
SLIDE 29

CMPS 6610/4610 – Fall 2016 29

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/3 4/-

b

5/- 6/-

g

  • f

e

Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-30
SLIDE 30

CMPS 6610/4610 – Fall 2016 30

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/3 4/-

b

5/- 6/- 7/- 7/8

  • g

f e

Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-31
SLIDE 31

CMPS 6610/4610 – Fall 2016 31

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/3 4/-

b

5/- 6/- 7/8 6/9

  • g

f e

Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-32
SLIDE 32

CMPS 6610/4610 – Fall 2016 32

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/3 4/-

b

5/-

f

7/8 6/9

  • g

f e

Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-33
SLIDE 33

CMPS 6610/4610 – Fall 2016 33

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/3 4/-

b

5/- 7/8 6/9 10/-

i

  • f

g f e

Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-34
SLIDE 34

CMPS 6610/4610 – Fall 2016 34

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/3 4/-

b

5/- 7/8 6/9 10/-

i

11/- 11/12

  • f

g f e

Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-35
SLIDE 35

CMPS 6610/4610 – Fall 2016 35

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/3 4/-

b

5/- 7/8 6/9 10/-

i

11/12 10/13

  • f

g f e

Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-36
SLIDE 36

CMPS 6610/4610 – Fall 2016 36

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/3 4/-

b

5/- 7/8 6/9

i

11/12 10/13 5/14

  • f

g f e

Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-37
SLIDE 37

CMPS 6610/4610 – Fall 2016 37

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/3 4/-

b

7/8 6/9

i

11/12 10/13 5/14 4/15

  • f

g f e

Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-38
SLIDE 38

CMPS 6610/4610 – Fall 2016 38

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a

1/-

b

2/3

b

7/8 6/9

i

11/12 10/13 5/14 4/15 1/16

  • f

g f e

Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-39
SLIDE 39

CMPS 6610/4610 – Fall 2016 39

Example of depth-first search

a b c d e f g i h

0/- d / f

: a b c d e f g h i a b

2/3

b

7/8 6/9

i

11/12 10/13 5/14 4/15 1/16 0/17

  • f

g f e

Store edges in predecessor array

DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-40
SLIDE 40

CMPS 6610/4610 – Fall 2016 40

Depth-First Search (DFS)

DFS(G=(V,E)) Mark all vertices in G as “unvisited” // time=0 for each vertex v  V do if v is unvisited DFS_rec(G,v) O(n) O(n)

without DFS_rec

O(deg(v))

without recursive call

O(1)  With Handshaking Lemma, all recursive calls are O(m), for a total of O(n + m) runtime DFS_rec(G, v) mark v as “visited” // d[v]=++time for each w adjacent to v do if w is unvisited Add edge (v,w) to tree T DFS_rec(G,w) mark v as “finished” // f[v]=++time

slide-41
SLIDE 41

CMPS 6610/4610 – Fall 2016 41

DFS runtime

  • Each vertex is visited at most once  O(n) time
  • The body of the for loops (except the recursive call) take constant

time per graph edge

  • All for loops take O(m) time
  • Total runtime is O(n+m) = O(|V| + |E|)
slide-42
SLIDE 42

CMPS 6610/4610 – Fall 2016 42

Paths, Cycles, Connectivity

Let G=(V,E) be a directed (or undirected) graph

  • A path from v1 to vk in G is a sequence of vertices v1, v2,…,vk such that

(vi,v{i+1})E (or {vi,v{i+1}} E if G is undirected) for all i{1,…,k-1}.

  • A path is simple if all vertices in the path are distinct.
  • A path v1, v2,…,vk forms a cycle if v1=vk .
  • A graph with no cycles is acyclic.
  • An undirected acyclic graph is called a tree. (Trees do not have to

have a root vertex specified.)

  • A directed acyclic graph is a DAG. (A DAG can have undirected

cycles if the direction of the edges is not considered.)

  • An undirected graph is connected if every pair of vertices is connected

by a path. A directed graph is strongly connected if for every pair u,vV there is a path from u to v and there is a path from v to u.

  • The (strongly) connected components of a graph are the equivalence

classes of vertices under this reachability relation.