CS 225
Data Structures
No Novem ember er 16 – Gr Graph aph Im Implementations and Tr Traversals
G G Ca Carl Evans
CS 225 Data Structures No Novem ember er 16 Gr Graph aph Im - - PowerPoint PPT Presentation
CS 225 Data Structures No Novem ember er 16 Gr Graph aph Im Implementations and Tr Traversals G G Ca Carl Evans Gr Grap aph ADT Functions: - insertVertex(K key); Data: - insertEdge(Vertex v1, Vertex v2, K key); - Vertices -
Data Structures
No Novem ember er 16 – Gr Graph aph Im Implementations and Tr Traversals
G G Ca Carl Evans
Functions:
Data:
maintaining the structure between vertices and edges.
X V W Z Y b e d f g h
v u w a c b z d u v w z u v a v w b u w c w z d
Vertex List Edge List
Key Ideas:
v u w a c b z d u v w z
u v w z u
Ø Ø
v
Ø Ø
w
Ø
z
Ø u v a v w b u w c w z d
Key Ideas:
list
O(1) lookup in the matrix
triangular matrix
v u w a c b z d u v w z u v a v w b u w c w z d
v u w a c b z d u v w z u v a v w b u w c w z d a c a b b c d d
d=2 d=2 d=3 d=1
v u w a c b z d u v w z u v a v w b u w c w z d a c a b b c d d
d=2 d=2 d=3 d=1
v u w a c b z d u v w z u v a v w b u w c w z d a c a b b c d d
d=2 d=2 d=3 d=1
insertVertex(K key):
v u w a c b z d u v w z u v a v w b u w c w z d a c a b b c d d
d=2 d=2 d=3 d=1
removeVertex(Vertex v):
v u w a c b z d u v w z u v a v w b u w c w z d a c a b b c d d
d=2 d=2 d=3 d=1
incidentEdges(Vertex v):
v u w a c b z d u v w z u v a v w b u w c w z d a c a b b c d d
d=2 d=2 d=3 d=1
areAdjacent(Vertex v1, Vertex v2):
v u w a c b z d u v w z u v a v w b u w c w z d a c a b b c d d
d=2 d=2 d=3 d=1
insertEdge(Vertex v1, Vertex v2, K key):
Expressed as O(f)
Edge List Adjacency Matrix Adjacency List Space n+m n2 n+m insertVertex(v) 1 n 1 removeVertex(v) m n deg(v) insertEdge(v, w, k) 1 1 1 removeEdge(v, w) 1 1 1 incidentEdges(v) m n deg(v) areAdjacent(v, w) m 1 min( deg(v), deg(w) )
change exceeds the tolerance
canTravel() returning true.
Objective: Visit every vertex and every edge in the graph. Purpose: Search for interesting sub-structures in the graph. We’ve seen traversal before ….but it’s different:
A C D E B F G H
A C D E B F G H v d P Adjacent Edges
A B C D E F G H
A C D E B F G H d p Adjacent Edges
0 A A C B D 1 A B A C E 1 A C B A D E F 1 A D A C F H 2 C E B C G 2 C F C D G 3 E G E F H 2 D H D G
G H F E D B C A
BFS(G): Input: Graph, G Output: A labeling of the edges on G as discovery and cross edges foreach (Vertex v : G.vertices()): setLabel(v, UNEXPLORED) foreach (Edge e : G.edges()): setLabel(e, UNEXPLORED) foreach (Vertex v : G.vertices()): if getLabel(v) == UNEXPLORED: BFS(G, v) 1 2 3 4 5 6 7 8 9 10 11 12 BFS(G, v): Queue q setLabel(v, VISITED) q.enqueue(v) while !q.empty(): v = q.dequeue() foreach (Vertex w : G.adjacent(v)): if getLabel(w) == UNEXPLORED: setLabel(v, w, DISCOVERY) setLabel(w, VISITED) q.enqueue(w) elseif getLabel(v, w) == UNEXPLORED: setLabel(v, w, CROSS) 14 15 16 17 18 19 20 21 22 23 24 25 26 27
Q: Does our implementation handle disjoint graphs? If so, what code handles this?
Q: Does our implementation detect a cycle?
Q: What is the running time?
A C D E B F G H d p v Adjacent
0 A A C B D 1 A B A C E 1 A C B A D E F 1 A D A C F H 2 C E B C G 2 C F C D G 3 E G E F H 2 D H D G
G H F E D B C A
While-loop at :19? For-loop at :21?
BFS(G): Input: Graph, G Output: A labeling of the edges on G as discovery and cross edges foreach (Vertex v : G.vertices()): setLabel(v, UNEXPLORED) foreach (Edge e : G.edges()): setLabel(e, UNEXPLORED) foreach (Vertex v : G.vertices()): if getLabel(v) == UNEXPLORED: BFS(G, v) 1 2 3 4 5 6 7 8 9 10 11 12 BFS(G, v): Queue q setLabel(v, VISITED) q.enqueue(v) while !q.empty(): v = q.dequeue() foreach (Vertex w : G.adjacent(v)): if getLabel(w) == UNEXPLORED: setLabel(v, w, DISCOVERY) setLabel(w, VISITED) q.enqueue(w) elseif getLabel(v, w) == UNEXPLORED: setLabel(v, w, CROSS) 14 15 16 17 18 19 20 21 22 23 24 25 26 27
A C D E B F G H d p v Adjacent
0 A A C B D 1 A B A C E 1 A C B A D E F 1 A D A C F H 2 C E B C G 2 C F C D G 3 E G E F H 2 D H D G
Q: What is a shortest path from A to H? Q: What is a shortest path from E to H? Q: How does a cross edge relate to d? Q: What structure is made from discovery edges?
every vertex.
differ in distance, d, by more than 1: |d(u) - d(v)| = 1
A C D E B F G H J K
BFS(G): Input: Graph, G Output: A labeling of the edges on G as discovery and cross edges foreach (Vertex v : G.vertices()): setLabel(v, UNEXPLORED) foreach (Edge e : G.edges()): setLabel(e, UNEXPLORED) foreach (Vertex v : G.vertices()): if getLabel(v) == UNEXPLORED: BFS(G, v) 1 2 3 4 5 6 7 8 9 10 11 12 BFS(G, v): Queue q setLabel(v, VISITED) q.enqueue(v) while !q.empty(): v = q.dequeue() foreach (Vertex w : G.adjacent(v)): if getLabel(w) == UNEXPLORED: setLabel(v, w, DISCOVERY) setLabel(w, VISITED) q.enqueue(w) elseif getLabel(v, w) == UNEXPLORED: setLabel(v, w, CROSS) 14 15 16 17 18 19 20 21 22 23 24 25 26 27
DFS(G): Input: Graph, G Output: A labeling of the edges on G as discovery and back edges foreach (Vertex v : G.vertices()): setLabel(v, UNEXPLORED) foreach (Edge e : G.edges()): setLabel(e, UNEXPLORED) foreach (Vertex v : G.vertices()): if getLabel(v) == UNEXPLORED: DFS(G, v) 1 2 3 4 5 6 7 8 9 10 11 12 DFS(G, v): Queue q setLabel(v, VISITED) q.enqueue(v) while !q.empty(): v = q.dequeue() foreach (Vertex w : G.adjacent(v)): if getLabel(w) == UNEXPLORED: setLabel(v, w, DISCOVERY) setLabel(w, VISITED) DFS(G, w) elseif getLabel(v, w) == UNEXPLORED: setLabel(v, w, BACK) 14 15 16 17 18 19 20 21 22 23 24 25 26 27
Labeling:
Queries:
A C D E B F G H J K