blob: daf8ca2021b4f85b3dfc6dfd628fbf199e5a94de [file] [log] [blame]
tom144de692014-08-29 11:38:44 -07001package org.onlab.graph;
2
3import java.util.HashSet;
4import java.util.Set;
5
6/**
7 * Implementation of the BFS algorithm.
8 */
9public class BreadthFirstSearch<V extends Vertex, E extends Edge<V>>
10 extends AbstractGraphPathSearch<V, E> {
11
12 @Override
tom2e1f0712014-08-29 13:32:00 -070013 public Result<V, E> search(Graph<V, E> graph, V src, V dst,
14 EdgeWeight<V, E> weight) {
tom144de692014-08-29 11:38:44 -070015 checkArguments(graph, src, dst);
tomc53fa0d2014-08-29 11:57:11 -070016
tom144de692014-08-29 11:38:44 -070017 // Prepare the graph result.
18 DefaultResult result = new DefaultResult(src, dst);
19
20 // Setup the starting frontier with the source as the sole vertex.
21 Set<V> frontier = new HashSet<>();
tom2e1f0712014-08-29 13:32:00 -070022 result.updateVertex(src, null, 0.0, true);
tom144de692014-08-29 11:38:44 -070023 frontier.add(src);
tomc53fa0d2014-08-29 11:57:11 -070024
tom19bf4212014-08-29 13:08:29 -070025 boolean reachedEnd = false;
26 while (!reachedEnd && !frontier.isEmpty()) {
tom144de692014-08-29 11:38:44 -070027 // Prepare the next frontier.
28 Set<V> next = new HashSet<>();
29
30 // Visit all vertexes in the current frontier.
31 for (V vertex : frontier) {
32 double cost = result.cost(vertex);
tomc53fa0d2014-08-29 11:57:11 -070033
tom144de692014-08-29 11:38:44 -070034 // Visit all egress edges of the current frontier vertex.
35 for (E edge : graph.getEdgesFrom(vertex)) {
36 V nextVertex = edge.dst();
37 if (!result.hasCost(nextVertex)) {
38 // If this vertex has not been visited yet, update it.
tom2e1f0712014-08-29 13:32:00 -070039 double newCost = cost + (weight == null ? 1.0 : weight.weight(edge));
40 result.updateVertex(nextVertex, edge, newCost, true);
tom144de692014-08-29 11:38:44 -070041 // If we have reached our intended destination, bail.
tomc53fa0d2014-08-29 11:57:11 -070042 if (nextVertex.equals(dst)) {
tom19bf4212014-08-29 13:08:29 -070043 reachedEnd = true;
44 break;
tomc53fa0d2014-08-29 11:57:11 -070045 }
tom144de692014-08-29 11:38:44 -070046 next.add(nextVertex);
47 }
tom19bf4212014-08-29 13:08:29 -070048
49 if (reachedEnd) {
50 break;
51 }
tom144de692014-08-29 11:38:44 -070052 }
53 }
tomc53fa0d2014-08-29 11:57:11 -070054
tom144de692014-08-29 11:38:44 -070055 // Promote the next frontier.
56 frontier = next;
57 }
tomc53fa0d2014-08-29 11:57:11 -070058
tom144de692014-08-29 11:38:44 -070059 // Finally, but the paths on the search result and return.
60 result.buildPaths();
61 return result;
62 }
tomc53fa0d2014-08-29 11:57:11 -070063
tom144de692014-08-29 11:38:44 -070064}