add better checks for forbidden routes

This commit is contained in:
Dennis Luxen 2014-12-22 18:12:47 +01:00
parent f4b192e33c
commit ea367a7f37

View File

@ -86,12 +86,12 @@ class TarjanSCC
public: public:
TarjanSCC(std::shared_ptr<GraphT> graph, TarjanSCC(std::shared_ptr<GraphT> graph,
const RestrictionMap &restrictions, const RestrictionMap &restrictions,
const std::vector<NodeID> &barrier_nodes) const std::vector<NodeID> &barrier_node_list)
: components_index(graph->GetNumberOfNodes(), SPECIAL_NODEID), : components_index(graph->GetNumberOfNodes(), SPECIAL_NODEID),
m_node_based_graph(graph), m_restriction_map(restrictions), m_node_based_graph(graph), m_restriction_map(restrictions),
size_one_counter(0) size_one_counter(0)
{ {
barrier_node_set.insert(std::begin(barrier_nodes), std::end(barrier_nodes)); barrier_node_set.insert(std::begin(barrier_node_list), std::end(barrier_node_list));
BOOST_ASSERT(m_node_based_graph->GetNumberOfNodes() > 0); BOOST_ASSERT(m_node_based_graph->GetNumberOfNodes() > 0);
} }
@ -118,8 +118,10 @@ class TarjanSCC
while (!recursion_stack.empty()) while (!recursion_stack.empty())
{ {
TarjanStackFrame currentFrame = recursion_stack.top(); TarjanStackFrame currentFrame = recursion_stack.top();
const NodeID u = currentFrame.parent;
const NodeID v = currentFrame.v; const NodeID v = currentFrame.v;
recursion_stack.pop(); recursion_stack.pop();
const bool before_recursion = processing_node_before_recursion[v]; const bool before_recursion = processing_node_before_recursion[v];
if (before_recursion && tarjan_node_list[v].index != UINT_MAX) if (before_recursion && tarjan_node_list[v].index != UINT_MAX)
@ -141,9 +143,29 @@ class TarjanSCC
++index; ++index;
// Traverse outgoing edges // Traverse outgoing edges
if (barrier_node_set.find(v) != barrier_node_set.end())
{
continue;
}
const NodeID to_node_of_only_restriction =
m_restriction_map.CheckForEmanatingIsOnlyTurn(u, v);
for (const auto current_edge : m_node_based_graph->GetAdjacentEdgeRange(v)) for (const auto current_edge : m_node_based_graph->GetAdjacentEdgeRange(v))
{ {
const auto vprime = m_node_based_graph->GetTarget(current_edge); const auto vprime = m_node_based_graph->GetTarget(current_edge);
if (to_node_of_only_restriction != std::numeric_limits<unsigned>::max() &&
vprime == to_node_of_only_restriction)
{
// At an only_-restriction but not at the right turn
// continue;
}
if (m_restriction_map.CheckIfTurnIsRestricted(u, v, vprime))
{
// continue;
}
if (SPECIAL_NODEID == tarjan_node_list[vprime].index) if (SPECIAL_NODEID == tarjan_node_list[vprime].index)
{ {
recursion_stack.emplace(TarjanStackFrame(vprime, v)); recursion_stack.emplace(TarjanStackFrame(vprime, v));