Lec9 - DirectedGraphs (With Demo)
Lec9 - DirectedGraphs (With Demo)
D IRECTED G RAPHS
University of Jordan
http: //al g s 4 . cs . pr i n c e to n . ed u
D IRECTED G RAPHS
‣ introduction
‣ digraph API
‣ digraph search
‣ topological sort
‣ strong components (Bonus)
http: //al g s 4 . cs . pr i n c e to n . ed u
Directed graphs
outdegree = 4
indegree = 2
0
6 8 7
directed path 1 2
from 0 to 2
3 9 10
4 directed cycle
5
11 12
3
Digraph applications
problem description
topological sort Can the digraph be drawn so that all edges point upwards?
transitive closure For which vertices v and w is there a directed path from v to w ?
12
D IRECTED G RAPHS
‣ introduction
‣ digraph API
‣ digraph search
‣ topological sort
‣ strong components (Bonus)
http: //al g s 4 . cs . pr i n c e to n . ed u
Digraph API
15
Digraph API
19
Digraph representations
list of edges E 1 E E
adjacency matrix V2 1† 1 V
20
Adjacency-lists graph representation (review): Java implementation
25
Depth-first search in digraphs
Mark v as visited.
Recursively visit all unmarked
vertices w pointing from v.
26
Depth-first search demo
4 43
35
5 68
11 12
86
54
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 F –
2 1 F –
1
2 F –
3 F –
4 F –
3 9 10
5 F –
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
a directed graph
11 F –
28
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 F –
1
2 F –
3 F –
4 F –
3 9 10
5 F –
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
visit 0: check 5 and check 1
11 F –
29
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 F –
1
2 F –
3 F –
4 F –
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
visit 5: check 4
11 F –
30
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 F –
1
2 F –
3 F –
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
visit 4: check 3 and check 2
11 F –
31
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 F –
1
2 F –
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
visit 3: check 5 and check 2
11 F –
32
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 F –
1
2 F –
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
visit 3: check 5 and check 2
11 F –
33
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 F –
1
2 T 3
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
visit 2: check 0 and check 3
11 F –
34
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 F –
1
2 T 3
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
visit 2: check 0 and check 3
11 F –
35
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 F –
1
2 T 3
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
done 2
11 F –
36
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 F –
1
2 T 3
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
done 3
11 F –
37
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 F –
1
2 T 3
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
visit 4: check 3 and check 2
11 F –
38
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 F –
1
2 T 3
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
done 4
11 F –
39
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 F –
1
2 T 3
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
done 5
11 F –
40
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 F –
1
2 T 3
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
visit 0: check 5 and check 1
11 F –
41
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 T 0
1
2 T 3
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
visit 1
11 F –
42
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 T 0
1
2 T 3
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
done 1
11 F –
43
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 T 0
1
2 T 3
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
done 0
11 F –
44
12 F –
Directed depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 T 0
1
2 T 3
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
done
11 F –
45
12 F –
Depth-first search demo
To visit a vertex v :
・Mark vertex v as visited.
・Recursively visit all unmarked vertices pointing from v.
0
v marked[] edgeTo[]
6 8 7
0 T –
2 1 T 0
1
reachable
2 T 3
from vertex 0
3 T 4
4 T 5
3 9 10
5 T 0
4 6 F –
7 F –
5
11 12 8 F –
9 F –
10 F –
reachable from 0
11 F –
46
12 F –
Depth-first search (in undirected graphs)
roots
50
Reachability application: mark-sweep garbage collector
roots
51
Breadth-first search in digraphs
tinyDG2.txt
V
0 2 6 E
8
5 0
1 2 4
3 2
1 2
3
0 1
5 4
4 3
3 5
0 2
graph G
54
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 – –
1
2 – –
3 – –
3
4 – –
5 4
5 – –
add 0 to queue
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 – –
1
2 – –
3 – –
3
4 – –
5 4
5 – –
0
dequeue 0
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 – –
1
0 1
2 – –
3 – –
3
4 – –
5 4
5 – –
dequeue 0
0: check 2 and check 1
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0
– 1
–
1
2 0 1
3 – –
3
4 – –
5 4
5 – –
2
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 – –
3
1 4 – –
5 4
5 – –
2
0 done
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 – –
3
1 4 – –
5 4
5 – –
2
dequeue 2
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 –
2 –
2
3
4 – –
5 4
5 – –
1
dequeue 2
2: check 4
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 – –
3
4 4 2 2
5 4
5 – –
1
2 done
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 – –
3
4 4 2 2
5 4
5 – –
1
dequeue 1
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 – –
3
4 2 2
5 4
5 – –
4
dequeue 1
1; check 2
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 – –
3
4 2 2
5 4
5 – –
4
1 done
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 – –
3
4 2 2
5 4
5 – –
4
dequeue 4
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
4 3
3 – –
3
4 2 2
5 4
5 – –
dequeue 4: check 3
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 4 3
3
4 2 2
5 4
5 – –
3
4 done
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 4 3
3
4 2 2
5 4
5 – –
3
dequeue 3
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 4 3
3
4 2
3 2
4
5 4
5 – –
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 4 3
3
4 2 2
5 4
5 3 4
5
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 4 3
3
4 2 2
5 4
5 3 4
5
3 done
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 4 3
3
4 2 2
5 4
5 3 4
5
dequeue 5
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 4 3
3
4 2 2
5 4
5 3 4
dequeue 5: check 0
Directed breadth-first search demo
0 2
queue v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 4 3
3
4 2 2
5 4
5 3 4
5 done
Directed breadth-first search demo
0 2
v edgeTo[] distTo[]
0 – 0
1 0 1
1
2 0 1
3 4 3
3
4 2 2
5 4
5 3 4
done
76