Next: DijkstraSSSP, Previous: SSSP and MST, Up: Graphs
#include <UDAlgorithms/utility.h>
#include <UDAlgorithms/graph.h>
void bfs(sequence<number> d, sequence<vertex> p, graph G, vertex s) {
// solve (unweighted undirected graph) SSSP problem.
vertex u, v; edge e; number w;
index n = size(G);
l0: std::queue<vertex> Q;
l1: for (index i = 1; i <= n; ++i) {
l2: d[i] = infinity; p[i] = nil;
}
l3: d[s] = 0; p[s] = nil; Q.push_back(s); // insert
l4: while ( not Q.empty() )
l5: v = Q.front(); Q.pop_front(); // extract_min
l6: for_each_neighbor(u, v, G) {
l7: len = d[v] + 1; // length of path s to u via v.
l8: if (d[u] > len) {
l9: d[u] = len; p[u] = v; Q.push_back(u);
}
}
}
void bfs(sequence<number> d, sequence<vertex> p, graph G, vertex s) {
// Dijkstra's algorithm: solves (weighted directed graph) SSSP problem.
vertex u, v; edge e; number w;
index n = size(G);
l0: min_priority_queue<vertex> Q;
l1: for (vertex v = 1; v <= n; ++v) {
l2: d[v] = infinity; p[v] = nil; Q.insert(v, d[v]);
}
l3: d[s] = 0; p[s] = nil; Q.decrease_key(s, d[s]);
l4: while ( not Q.empty() )
l5: v = Q.extract_min();
l6: for_each_out_edge(e, v, G) {
l7: u = e.tip; len = d[v] + e.weight; // length of path s to u via v.
l8: if (d[u] > len) {
l9: d[u] = len; p[u] = v; Q.decrease_key(u, d[u]);
}
}
}