Example #1
0
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();
    }
}