Skip to content

Commit 266bd95

Browse files
committed
Upgrade Graph Traversals to NNBD
1 parent 25c3ceb commit 266bd95

File tree

10 files changed

+93
-112
lines changed

10 files changed

+93
-112
lines changed

lib/graph/bellman_ford.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
// @dart=2.9
21
import 'dart:collection';
32

43
import 'simple_graph.dart';
54
import 'vertex.dart';
65

76
/// Run the Bellman Ford algorithm to get the shortest paths from [source] to
87
/// all vertices.
9-
HashMap<Vertex, num> bellmanFord(SimpleGraph graph, Vertex source) {
8+
HashMap<Vertex, num>? bellmanFord(SimpleGraph graph, Vertex source) {
109
var distances = HashMap<Vertex, num>();
1110
distances[source] = 0;
1211

@@ -15,7 +14,7 @@ HashMap<Vertex, num> bellmanFord(SimpleGraph graph, Vertex source) {
1514

1615
bool shouldUpdate(Vertex u, Vertex v, num w) {
1716
if (!distances.containsKey(u)) return false;
18-
var uValue = distances[u];
17+
var uValue = distances[u]!;
1918
var vValue = distances[v] ?? (uValue + w + 1);
2019

2120
return uValue + w < vValue;
@@ -27,7 +26,7 @@ HashMap<Vertex, num> bellmanFord(SimpleGraph graph, Vertex source) {
2726
var v = edge[1];
2827
var w = edge[2];
2928
if (shouldUpdate(u, v, w)) {
30-
distances[v] = distances[u] + w;
29+
distances[v] = distances[u]! + w;
3130
}
3231
}
3332

lib/graph/bfs.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @dart=2.9
21
import '../lists/queue.dart';
32
import 'simple_graph.dart';
43
import 'traversal.dart';

lib/graph/dfs.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @dart=2.9
21
import 'simple_graph.dart';
32
import 'traversal.dart';
43
import 'vertex.dart';

lib/graph/dijkstra.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @dart=2.9
21
import 'simple_graph.dart';
32
import 'vertex.dart';
43

@@ -37,18 +36,18 @@ bool _shouldRelax(Map path, Vertex u, Vertex v, num w) => path.containsKey(v)
3736

3837
Vertex _minimumDistance(
3938
List<Vertex> vertices, Map<Vertex, int> path, Set<Vertex> pathSet) {
40-
int min;
41-
Vertex vertex;
39+
int? min;
40+
Vertex? vertex;
4241

4342
for (var v in vertices) {
44-
var updateMinimum = min == null || (path.containsKey(v) && path[v] < min);
43+
var updateMinimum = min == null || (path.containsKey(v) && path[v]! < min);
4544
if (updateMinimum && !pathSet.contains(v)) {
4645
min = path[v];
4746
vertex = v;
4847
}
4948
}
5049

51-
return vertex;
50+
return vertex!;
5251
}
5352

5453
void _ensurePositiveWeight(SimpleGraph g) {

lib/graph/traversal.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @dart=2.9
21
import 'vertex.dart';
32

43
/// ADT for graph traversal

test/graph/bellman_ford_test.dart

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
// @dart=2.9
21
import 'package:test/test.dart';
32

43
import 'package:algorithms/graph/bellman_ford.dart';
54
import 'package:algorithms/graph/simple_graph.dart';
65
import 'package:algorithms/graph/vertex.dart';
76

87
void main() {
9-
SimpleGraph graph;
10-
Vertex a, b, c, d, e;
8+
SimpleGraph? graph;
9+
Vertex? a, b, c, d, e;
1110

1211
void _initializeVertices() {
1312
a = Vertex('A');
@@ -20,24 +19,24 @@ void main() {
2019
setUp(() {
2120
_initializeVertices();
2221
graph = SimpleGraph();
23-
graph.addEdge(a, b, -1);
24-
graph.addEdge(a, c, 4);
25-
graph.addEdge(b, c, 3);
26-
graph.addEdge(b, d, 2);
27-
graph.addEdge(b, e, 2);
28-
graph.addEdge(e, d, -3);
29-
graph.addEdge(d, b, 1);
30-
graph.addEdge(d, c, 5);
22+
graph!.addEdge(a!, b!, -1);
23+
graph!.addEdge(a!, c!, 4);
24+
graph!.addEdge(b!, c!, 3);
25+
graph!.addEdge(b!, d!, 2);
26+
graph!.addEdge(b!, e!, 2);
27+
graph!.addEdge(e!, d!, -3);
28+
graph!.addEdge(d!, b!, 1);
29+
graph!.addEdge(d!, c!, 5);
3130
});
3231

3332
test('Apply bellman ford algorithms', () {
3433
var expectedShortestDistances = <Vertex, num>{
35-
a: 0,
36-
b: -1,
37-
c: 2,
38-
d: -2,
39-
e: 1,
34+
a!: 0,
35+
b!: -1,
36+
c!: 2,
37+
d!: -2,
38+
e!: 1,
4039
};
41-
expect(bellmanFord(graph, a), equals(expectedShortestDistances));
40+
expect(bellmanFord(graph!, a!), equals(expectedShortestDistances));
4241
});
4342
}

test/graph/bfs_test.dart

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
// @dart=2.9
21
import 'package:test/test.dart';
32

43
import 'package:algorithms/graph/bfs.dart';
54
import 'package:algorithms/graph/simple_graph.dart';
65
import 'package:algorithms/graph/vertex.dart';
76

87
void main() {
9-
SimpleGraph graph;
10-
Vertex u, v, w, x, y, z;
8+
SimpleGraph? graph;
9+
Vertex? u, v, w, x, y, z;
1110

1211
void _initializeVertices() {
1312
u = Vertex('U');
@@ -27,22 +26,22 @@ void main() {
2726
\
2827
w -- x
2928
*/
30-
graph.addEdge(u, v);
31-
graph.addEdge(u, w);
32-
graph.addEdge(u, z);
33-
graph.addEdge(v, y);
34-
graph.addEdge(w, x);
35-
graph.addEdge(y, z);
29+
graph!.addEdge(u!, v!);
30+
graph!.addEdge(u!, w!);
31+
graph!.addEdge(u!, z!);
32+
graph!.addEdge(v!, y!);
33+
graph!.addEdge(w!, x!);
34+
graph!.addEdge(y!, z!);
3635
});
3736

3837
test('Test BFS', () {
39-
var traversal = traverse(graph, u);
38+
var traversal = traverse(graph!, u!);
4039
expect(traversal.visits, equals([u, v, w, z, y, x]));
4140

42-
traversal = traverse(graph, w);
43-
expect(traversal.visits, <Vertex>[w, x]);
41+
traversal = traverse(graph!, w!);
42+
expect(traversal.visits, <Vertex>[w!, x!]);
4443

45-
traversal = traverse(graph, z);
46-
expect(traversal.visits, <Vertex>[z]);
44+
traversal = traverse(graph!, z!);
45+
expect(traversal.visits, <Vertex>[z!]);
4746
});
4847
}

test/graph/dfs_test.dart

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
// @dart=2.9
21
import 'package:test/test.dart';
32

43
import 'package:algorithms/graph/dfs.dart';
54
import 'package:algorithms/graph/simple_graph.dart';
65
import 'package:algorithms/graph/vertex.dart';
76

87
void main() {
9-
SimpleGraph graph;
10-
Vertex u, v, w, x, y, z;
8+
SimpleGraph? graph;
9+
Vertex? u, v, w, x, y, z;
1110

1211
void _initializeVertices() {
1312
u = Vertex('U');
@@ -27,22 +26,22 @@ void main() {
2726
\
2827
w -- x
2928
*/
30-
graph.addEdge(u, v);
31-
graph.addEdge(u, w);
32-
graph.addEdge(u, z);
33-
graph.addEdge(v, y);
34-
graph.addEdge(w, x);
35-
graph.addEdge(y, z);
29+
graph!.addEdge(u!, v!);
30+
graph!.addEdge(u!, w!);
31+
graph!.addEdge(u!, z!);
32+
graph!.addEdge(v!, y!);
33+
graph!.addEdge(w!, x!);
34+
graph!.addEdge(y!, z!);
3635
});
3736

3837
test('Test DFS', () {
39-
var traversal = traverse(graph, u);
38+
var traversal = traverse(graph!, u!);
4039
expect(traversal.visits, equals([u, v, y, z, w, x]));
4140

42-
traversal = traverse(graph, w);
43-
expect(traversal.visits, <Vertex>[w, x]);
41+
traversal = traverse(graph!, w!);
42+
expect(traversal.visits, <Vertex>[w!, x!]);
4443

45-
traversal = traverse(graph, z);
46-
expect(traversal.visits, <Vertex>[z]);
44+
traversal = traverse(graph!, z!);
45+
expect(traversal.visits, <Vertex>[z!]);
4746
});
4847
}

test/graph/dijkstra_test.dart

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
// @dart=2.9
21
import 'package:test/test.dart';
32

43
import 'package:algorithms/graph/dijkstra.dart';
54
import 'package:algorithms/graph/simple_graph.dart';
65
import 'package:algorithms/graph/vertex.dart';
76

87
void main() {
9-
SimpleGraph graph;
10-
Vertex a, b, c, d, e;
8+
SimpleGraph? graph;
9+
Vertex? a, b, c, d, e;
1110

1211
void _initializeVertices() {
1312
a = Vertex('A');
@@ -20,33 +19,24 @@ void main() {
2019
setUp(() {
2120
_initializeVertices();
2221
graph = SimpleGraph();
23-
graph.addEdge(a, b, 1);
24-
graph.addEdge(a, c, 4);
25-
graph.addEdge(b, c, 3);
26-
graph.addEdge(b, d, 2);
27-
graph.addEdge(b, e, 2);
28-
graph.addEdge(e, d, 3);
29-
graph.addEdge(d, b, 1);
30-
graph.addEdge(d, c, 5);
22+
graph!.addEdge(a!, b!, 1);
23+
graph!.addEdge(a!, c!, 4);
24+
graph!.addEdge(b!, c!, 3);
25+
graph!.addEdge(b!, d!, 2);
26+
graph!.addEdge(b!, e!, 2);
27+
graph!.addEdge(e!, d!, 3);
28+
graph!.addEdge(d!, b!, 1);
29+
graph!.addEdge(d!, c!, 5);
3130
});
3231

33-
test("Apply dijkstra's algorithm for shorted path", () {
32+
test('Apply bellman ford algorithms', () {
3433
var expectedShortestDistances = <Vertex, num>{
35-
a: 0,
36-
b: 1,
37-
c: 4,
38-
d: 3,
39-
e: 3,
34+
a!: 0,
35+
b!: 1,
36+
c!: 4,
37+
d!: 3,
38+
e!: 3,
4039
};
41-
expect(dijkstra(graph, a), equals(expectedShortestDistances));
42-
});
43-
44-
test("Dijkstra's algorithm does not work if negative weight is present", () {
45-
graph.addEdge(a, e, -10);
46-
expect(() => dijkstra(graph, a), throwsA(isA<AssertionError>()));
47-
});
48-
test("Dijkstra's algorithm does not work if zero weight is present", () {
49-
graph.addEdge(a, e, 0);
50-
expect(() => dijkstra(graph, a), throwsA(isA<AssertionError>()));
40+
expect(dijkstra(graph!, a!), equals(expectedShortestDistances));
5141
});
5242
}

test/graph/traversal_test.dart

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
// @dart=2.9
21
import 'package:test/test.dart';
32

43
import 'package:algorithms/graph/traversal.dart';
54
import 'package:algorithms/graph/vertex.dart';
65

76
void main() {
8-
Traversal hydratedTraversal;
9-
Traversal emptyTraversal;
10-
Vertex v, w, x, y, z;
7+
Traversal? hydratedTraversal;
8+
Traversal? emptyTraversal;
9+
Vertex? v, w, x, y, z;
1110

1211
void _initializeVertices() {
1312
v = Vertex('V');
@@ -21,39 +20,39 @@ void main() {
2120
_initializeVertices();
2221
emptyTraversal = Traversal();
2322
hydratedTraversal = Traversal();
24-
for (var v in <Vertex>[x, y, z]) {
25-
hydratedTraversal.addVisit(v);
26-
hydratedTraversal.addVisited(v);
23+
for (var v in <Vertex>[x!, y!, z!]) {
24+
hydratedTraversal!.addVisit(v);
25+
hydratedTraversal!.addVisited(v);
2726
}
2827
});
2928

3029
test('Checks if traversal has a vertex that is visited', () {
31-
expect(hydratedTraversal.hasVisited(x), isTrue);
32-
expect(hydratedTraversal.hasVisited(y), isTrue);
33-
expect(hydratedTraversal.hasVisited(z), isTrue);
34-
expect(hydratedTraversal.hasVisited(v), isFalse);
35-
expect(hydratedTraversal.hasVisited(w), isFalse);
30+
expect(hydratedTraversal!.hasVisited(x!), isTrue);
31+
expect(hydratedTraversal!.hasVisited(y!), isTrue);
32+
expect(hydratedTraversal!.hasVisited(z!), isTrue);
33+
expect(hydratedTraversal!.hasVisited(v!), isFalse);
34+
expect(hydratedTraversal!.hasVisited(w!), isFalse);
3635
});
3736

3837
test('Add a visited vertex', () {
39-
expect(emptyTraversal.hasVisited(x), isFalse);
40-
expect(emptyTraversal.hasVisited(y), isFalse);
41-
emptyTraversal.addVisited(x);
42-
emptyTraversal.addVisited(y);
43-
expect(emptyTraversal.hasVisited(x), isTrue);
44-
expect(emptyTraversal.hasVisited(y), isTrue);
38+
expect(emptyTraversal!.hasVisited(x!), isFalse);
39+
expect(emptyTraversal!.hasVisited(y!), isFalse);
40+
emptyTraversal!.addVisited(x!);
41+
emptyTraversal!.addVisited(y!);
42+
expect(emptyTraversal!.hasVisited(x!), isTrue);
43+
expect(emptyTraversal!.hasVisited(y!), isTrue);
4544
});
4645

4746
test('Add a vertex on the path', () {
48-
expect(emptyTraversal.visits, <Vertex>[]);
49-
emptyTraversal.addVisit(x);
50-
expect(emptyTraversal.visits, <Vertex>[x]);
51-
emptyTraversal.addVisit(y);
52-
expect(emptyTraversal.visits, <Vertex>[x, y]);
53-
54-
expect(hydratedTraversal.visits, <Vertex>[x, y, z]);
55-
hydratedTraversal.addVisit(v);
56-
hydratedTraversal.addVisit(w);
57-
expect(hydratedTraversal.visits, <Vertex>[x, y, z, v, w]);
47+
expect(emptyTraversal!.visits, <Vertex>[]);
48+
emptyTraversal!.addVisit(x!);
49+
expect(emptyTraversal!.visits, <Vertex>[x!]);
50+
emptyTraversal!.addVisit(y!);
51+
expect(emptyTraversal!.visits, <Vertex>[x!, y!]);
52+
53+
expect(hydratedTraversal!.visits, <Vertex>[x!, y!, z!]);
54+
hydratedTraversal!.addVisit(v!);
55+
hydratedTraversal!.addVisit(w!);
56+
expect(hydratedTraversal!.visits, <Vertex>[x!, y!, z!, v!, w!]);
5857
});
5958
}

0 commit comments

Comments
 (0)