15 Graphs
15 Graphs
2
3
2
Nodes/vertices
4
2
5
2
6
2 6
5
3
4
1
7
5 2
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1 2
5 4
1 2 3 4 5
1 0 1 0 1 0
2 0 0 0 0 1
3 1 0 0 0 0
4 0 0 1 0 0
5 0 0 0 0 0
21
5
1 2
7
3
2 4
3
5 4
1 2 3 4 5
1
5 4
2 2
3 7
4 3
5
22
23
24
25
26
1 2 4 1 2
2 5 3
3 1
5 4
4 3
27
1 2 4 1 2
2 5 3
3 1
5 4
4 3
An adjacency list
5
28
1 2
1 2 4
3
2 5
3 1 5 4
4 3
Array of pointers to
Adjacency lists
5
2 5 3
3 1
5 4
4 3
2 5 3
3 1
5 4
4 3
5
If the edges have weights they
can be stored in the list
elements.
31
32
33
34
35
36
37
CS305
CS402
CS201
CS204 CS300
CS307
38
CS305
CS402
CS201
CS202 CS300
Vertex with
in-degree 0 CS307
39
CS305
CS402
CS201
CS204 CS301
Vertices with
CS307 out-degree 0
40
CS305
CS402
CS201
CS204 CS300
CS307
41
CS305
CS402
CS201
CS204 CS300
CS307
CS201
42
CS305
CS402
CS204 CS300
CS307
CS201
43
CS305
CS402
CS204 CS300
CS307
CS201
44
CS305
CS402
CS204 CS300
CS307
CS201,CS204
45
CS305
CS402
CS300
CS307
CS201,CS204
46
CS305
CS402
CS300
CS307
CS201,CS204
47
CS305
CS402
CS300
CS307
CS201,CS204,CS305
48
CS402
CS300
CS307
CS201,CS202,CS305
49
CS402
CS300
CS307
CS201,CS204,CS305 50
CS402
CS300
CS307
CS201,CS204,CS305,CS307 51
CS402
CS300
CS201,CS204,CS305,CS307
52
CS402
CS300
CS201,CS204,CS305,CS307
53
CS402
CS300
CS201,CS204,CS305,CS307,CS300
54
CS402
CS201,CS204,CS305,CS307,CS300
55
CS402
CS201,CS204,CS305,CS307,CS300
56
CS402
CS201,CS204,CS305,CS307,CS300,CS402
57
CS201,CS204,CS305,CS307,CS300,CS402
58
59
void Graph::topsort( )
{
Vertex v,w;
for (int counter=0; counter < NUM_VERTICES; counter++)
{
// find a vertex with in-degree = 0
v = findNewVertexOfDegreeZero( );
v.topNum = counter;
// the next loop depends on the graph representation
// so it is in pseudocode
for each w adjacent to v
w.indegree --;
}
60
}
61
62
void Graph::topsort( )
{
Queue q (NUM_VERTICES);
int counter = 0;
Vertex v,w;
// pseudocode for initialization
for each vertex v
if (v.indegree == 0) q.enqueue(v);
// Check vertices in the queues
while ( ! q.isEmpty( ) ) {
v = q.dequeue( );
v.topNum = ++counter;
// put new 0 indegree vertices to queue
for each w adjacent to v
if (––w.indegree == 0) q.enqueue( w);
}
// At the end, check for cycles
if (counter != NUM_VERTICES) throw CycleFound( );
} 63
64
N 1
c
i 1
i ,i 1
65
2
v1 v2
4 1 3 10
2 2
v3 v4 v5
8 4
6
5
1
v6 v7
66
2
v1 v2
4 1 3 10
2 2
v3 v4 v5
8 4
6
5
1
v6 v7
Cost = 1+8 = 9
67
2
v1 v2
4 1 3 10
2 2
v3 v4 v5
8 4
6
5
1
v6 v7
Cost = 2+10+6+1 = 19
68
2
v1 v2
4 1 3 10
2 2
v3 v4 v5
8 4
6
5
1
v6 v7
Cost = 2+3+4+1 = 10
69
2
v1 v2
4 1 3 10
2 2
v3 v4 v5
8 4
6
5
1
v6 v7
2 2
v3 v4 v5
8 4
6
5
1
v6 v7
71
Edges with negative costs may cause problems!
2
v1 v2
4 1 3 –10
2 1
v3 v4 v5
6 2
6
5
1
v6 v7
72
Edges with negative costs will cause problems!
2
v1 v2
4 1 3 –10
2 1
v3 v4 v5
6 2
6
5
1
v6 v7
73
Edges with negative costs will cause problems!
2
v1 v2
4 1 3 –10
2 1
v3 v4 v5
6 2
6
5
1
v6 v7
74
Edges with negative costs will cause problems!
2
v1 v2
4 1 3 –10
2 1
v3 v4 v5
6 2
6
5
1
v6 v7
2 1
v3 v4 v5
6 2
6
5
1
v6 v7
v3 v4 v5
v6 v7
80
v1 v2
s v3 v4 v5
v6 v7
81
v1 v2
s v3 v4 v5
v6 v7
82
1
v1 v2
s v3 v4 v5
v6 v7
s v3 v4 v5
2
0
v6 v7
s v3 v4 v5
2
0
v6 v7
s v3 v4 v5
2
0
v6 v7
s v3 v4 v5
2
0
v6 v7
3
1
s v3 v4 v5
2
0
v6 v7
3
1
s v3 v4 v5
2
0
v6 v7
3
1
while ( ! q.isEmpty( ) ) {
v = q.dequeue( );
for each w adjacent to v
if (w.dist == INFINITY) {
w.dist = v.dist+1;
w.path = v;
q.enqueue (w);
}
}
Note1: Vertices are queued in order of distance from s
}
void Graph::unweighted (Vertex s)
{
Queue q(NUM_VERTICES);
Vertex v, w;
q.enqueue (s); // start the process
s.dist = 0;
while ( ! q.isEmpty( ) ) {
v = q.dequeue( );
for each w adjacent to v
if (w.dist == INFINITY) {
w.dist = v.dist+1;
w.path = v;
q.enqueue (w);
}
} Note1: Vertices are queued in order of distance from s
} Note2: If queue becomes empty prematurely, this indicates there
are nodes that are not reachable from the start node s.
void Graph::unweighted (Vertex s)
{
Queue q(NUM_VERTICES);
Vertex v, w;
q.enqueue (s); // start the process
s.dist = 0;
while ( ! q.isEmpty( ) ) {
v = q.dequeue( );
for each w adjacent to v
if (w.dist == INFINITY) {
w.dist = v.dist+1;
w.path = v;
q.enqueue (w);
}
}
} Running time is O(|V| + |E|)
97
2
v1 v2
4 1 3 10
2 2
v3 v4 v5
8 4
6
5
1
v6 v7
98
99
100
101
102
103
104
2
v1 v2
4 1 3 10
2 2
v3 v4 v5
8 4
6
5
1
v6 v7
105
∞ ( ?)
2
∞ ( ?) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 ∞ ( ?)
∞ ( ?)
8 4
6
5
1
v6 v7
∞ ( ?)
∞ ( ?)
X (Y)
2 2
0 ( 3) v3 v4 v5 ∞ ( ?)
∞ ( ?)
8 4
6
5
1
v6 v7
∞ ( ?)
∞ ( ?)
107
∞ ( ?)
2
4 ( 3) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 ∞ ( ?)
∞ ( ?)
8 4
6
5
1
v6 v7
∞ ( ?)
∞ ( ?)
108
∞ ( ?)
2
4 ( 3) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 ∞ ( ?)
2 ( 3)
8 4
6
5
1
v6 v7
∞ ( ?)
∞ ( ?)
109
∞ ( ?)
2
4 ( 3) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 ∞ ( ?)
2 ( 3)
8 4
6
5
1
v6 v7
∞ ( ?)
5 ( 3)
110
∞ ( ?)
2
4 ( 3) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 ∞ ( ?)
2 ( 3)
8 4
6
5
1
v6 v7
∞ ( ?)
5 ( 3)
111
∞ ( ?)
2
4 ( 3) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 ∞ ( ?)
2 ( 3)
8 4
6
5
1
v6 v7
∞ ( ?)
5 ( 3)
112
∞ ( ?)
2
4 ( 3) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 ∞ ( ?)
2 ( 3)
8 4
6
5
1
v6 v7
∞ ( ?)
5 ( 3)
113
∞ ( ?)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 ∞ ( ?)
2 ( 3)
8 4
6
5
1
v6 v7
∞ ( ?)
5 ( 3)
114
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 ∞ ( ?)
2 ( 3)
8 4
6
5
1
v6 v7
∞ ( ?)
5 ( 3)
115
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
∞ ( ?)
5 ( 3)
116
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
117
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
118
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
119
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
120
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
121
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
122
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
123
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
124
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
125
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
126
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
127
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
128
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
129
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
130
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
131
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
132
5 ( 4)
2
3 ( 4) v1 v2
4 1 3 10
2 2
0 ( 3) v3 v4 v5 4 ( 4)
2 ( 3)
8 4
6
5
1
v6 v7
6 ( 4)
5 ( 3)
Shortest path to V2 = V3 – V4 – V2
133
134
135
136
137
138
139
140
141
142
143