Change interface of Tarjan get_component_size to take component id

This commit is contained in:
Patrick Niklaus 2015-07-07 18:24:18 +02:00
parent c80c2233c5
commit 35542e5823
3 changed files with 24 additions and 9 deletions

View File

@ -196,9 +196,9 @@ template <typename GraphT> class TarjanSCC
std::size_t get_size_one_count() const { return size_one_counter; }
unsigned get_component_size(const NodeID node) const
unsigned get_component_size(const unsigned component_id) const
{
return component_size_vector[components_index[node]];
return component_size_vector[component_id];
}
unsigned get_component_id(const NodeID node) const { return components_index[node]; }

View File

@ -137,7 +137,11 @@ void Prepare::FindComponents(unsigned max_edge_id, const DeallocatingVector<Edge
std::vector<EdgeBasedNode>& input_nodes) const
{
struct UncontractedEdgeData { };
using InputEdge = StaticGraph<UncontractedEdgeData>::InputEdge;
struct InputEdge {
unsigned source;
unsigned target;
UncontractedEdgeData data;
};
using UncontractedGraph = StaticGraph<UncontractedEdgeData>;
std::vector<InputEdge> edges;
edges.reserve(input_edge_list.size() * 2);
@ -148,12 +152,12 @@ void Prepare::FindComponents(unsigned max_edge_id, const DeallocatingVector<Edge
"edge distance < 1");
if (edge.forward)
{
edges.emplace_back(edge.source, edge.target);
edges.push_back({edge.source, edge.target, {}});
}
if (edge.backward)
{
edges.emplace_back(edge.target, edge.source);
edges.push_back({edge.target, edge.source, {}});
}
}
@ -162,12 +166,23 @@ void Prepare::FindComponents(unsigned max_edge_id, const DeallocatingVector<Edge
{
if (node.reverse_edge_based_node_id != SPECIAL_NODEID)
{
edges.emplace_back(node.forward_edge_based_node_id, node.reverse_edge_based_node_id);
edges.emplace_back(node.reverse_edge_based_node_id, node.forward_edge_based_node_id);
edges.push_back({node.forward_edge_based_node_id, node.reverse_edge_based_node_id, {}});
edges.push_back({node.reverse_edge_based_node_id, node.forward_edge_based_node_id, {}});
}
}
tbb::parallel_sort(edges.begin(), edges.end());
tbb::parallel_sort(edges.begin(), edges.end(),
[](const InputEdge& lhs, const InputEdge& rhs)
{
return lhs.source < rhs.source || (lhs.source == rhs.source && lhs.target < rhs.target);
});
auto new_end = std::unique(edges.begin(), edges.end(),
[](const InputEdge& lhs, const InputEdge& rhs)
{
return lhs.source == rhs.source && lhs.target == rhs.target;
});
edges.resize(new_end - edges.begin());
auto uncontractor_graph = std::make_shared<UncontractedGraph>(max_edge_id+1, edges);
TarjanSCC<UncontractedGraph> component_search(std::const_pointer_cast<const UncontractedGraph>(uncontractor_graph));

View File

@ -217,7 +217,7 @@ int main(int argc, char *argv[])
BOOST_ASSERT(target != SPECIAL_NODEID);
const unsigned size_of_containing_component = std::min(
tarjan->get_component_size(source), tarjan->get_component_size(target));
tarjan->get_component_size(tarjan->get_component_id(source)), tarjan->get_component_size(tarjan->get_component_id(target)));
// edges that end on bollard nodes may actually be in two distinct components
if (size_of_containing_component < 1000)