Change interface of Tarjan get_component_size to take component id
This commit is contained in:
parent
c80c2233c5
commit
35542e5823
@ -196,9 +196,9 @@ template <typename GraphT> class TarjanSCC
|
|||||||
|
|
||||||
std::size_t get_size_one_count() const { return size_one_counter; }
|
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]; }
|
unsigned get_component_id(const NodeID node) const { return components_index[node]; }
|
||||||
|
@ -137,7 +137,11 @@ void Prepare::FindComponents(unsigned max_edge_id, const DeallocatingVector<Edge
|
|||||||
std::vector<EdgeBasedNode>& input_nodes) const
|
std::vector<EdgeBasedNode>& input_nodes) const
|
||||||
{
|
{
|
||||||
struct UncontractedEdgeData { };
|
struct UncontractedEdgeData { };
|
||||||
using InputEdge = StaticGraph<UncontractedEdgeData>::InputEdge;
|
struct InputEdge {
|
||||||
|
unsigned source;
|
||||||
|
unsigned target;
|
||||||
|
UncontractedEdgeData data;
|
||||||
|
};
|
||||||
using UncontractedGraph = StaticGraph<UncontractedEdgeData>;
|
using UncontractedGraph = StaticGraph<UncontractedEdgeData>;
|
||||||
std::vector<InputEdge> edges;
|
std::vector<InputEdge> edges;
|
||||||
edges.reserve(input_edge_list.size() * 2);
|
edges.reserve(input_edge_list.size() * 2);
|
||||||
@ -148,12 +152,12 @@ void Prepare::FindComponents(unsigned max_edge_id, const DeallocatingVector<Edge
|
|||||||
"edge distance < 1");
|
"edge distance < 1");
|
||||||
if (edge.forward)
|
if (edge.forward)
|
||||||
{
|
{
|
||||||
edges.emplace_back(edge.source, edge.target);
|
edges.push_back({edge.source, edge.target, {}});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (edge.backward)
|
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)
|
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.push_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.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);
|
auto uncontractor_graph = std::make_shared<UncontractedGraph>(max_edge_id+1, edges);
|
||||||
|
|
||||||
TarjanSCC<UncontractedGraph> component_search(std::const_pointer_cast<const UncontractedGraph>(uncontractor_graph));
|
TarjanSCC<UncontractedGraph> component_search(std::const_pointer_cast<const UncontractedGraph>(uncontractor_graph));
|
||||||
|
@ -217,7 +217,7 @@ int main(int argc, char *argv[])
|
|||||||
BOOST_ASSERT(target != SPECIAL_NODEID);
|
BOOST_ASSERT(target != SPECIAL_NODEID);
|
||||||
|
|
||||||
const unsigned size_of_containing_component = std::min(
|
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
|
// edges that end on bollard nodes may actually be in two distinct components
|
||||||
if (size_of_containing_component < 1000)
|
if (size_of_containing_component < 1000)
|
||||||
|
Loading…
Reference in New Issue
Block a user