BellmanFordSP::BellmanFordSP(const EWDiGraph& graph, int source) : distances(graph.getVertexCount(), std::numeric_limits<double>::max()), edges(graph.getVertexCount(), Edge(0, 0, 0.0)) { std::queue<int> considerVertecies; for (int i = 0; i < graph.getVertexCount(); i++) { considerVertecies.push(i); } distances[source] = 0.0; for (int i = 0; i < graph.getVertexCount(); i++) { std::queue<int> nextPassVertecies; while (!considerVertecies.empty()) { if (i == graph.getVertexCount() - 1) findNegativeCycle(considerVertecies.front()); EWDiGraph::EdgesList adjacent = graph.getAdjacentVertex(considerVertecies.front()); for (auto k = adjacent.begin(); k != adjacent.end(); ++k) { relax(*k, nextPassVertecies); } considerVertecies.pop(); } considerVertecies = nextPassVertecies; } }
void BellmanFord::relax(EdgeWeightedDigraph &G, int v){ std::deque<DirectedEdge>::const_iterator it; for(it = G.Iterable(v)->begin(); it != G.Iterable(v)->end(); ++it){ int w = it->to(); if(distTo[w] > distTo[v] + it->Getweight()){ distTo[w] = distTo[v] + it->Getweight(); edgeTo[w] = *it; if(!onQ[w]) { queue.push_back(w); onQ[w]=true; } } if(cost++ % G.GetV() == 0) findNegativeCycle(); } }