From cdd5a41965959bd1970805f091162426d86693a8 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Thu, 5 Jun 2014 15:33:24 +0200 Subject: [PATCH] remove duplicate edges from NodeBasedGraph --- DataStructures/NodeBasedGraph.h | 82 +++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 14 deletions(-) diff --git a/DataStructures/NodeBasedGraph.h b/DataStructures/NodeBasedGraph.h index 8b9d52545..98393fbd8 100644 --- a/DataStructures/NodeBasedGraph.h +++ b/DataStructures/NodeBasedGraph.h @@ -3,6 +3,7 @@ #include "DynamicGraph.h" #include "ImportEdge.h" +#include "../Util/SimpleLogger.h" #include @@ -54,26 +55,24 @@ NodeBasedDynamicGraphFromImportEdges(int number_of_nodes, std::vector edges_list; NodeBasedDynamicGraph::InputEdge edge; for (const ImportEdge &import_edge : input_edge_list) { - // TODO: give ImportEdge a proper c'tor to use emplace_back's below - if (!import_edge.forward) - { - edge.source = import_edge.target; - edge.target = import_edge.source; - edge.data.backward = import_edge.forward; - edge.data.forward = import_edge.backward; - } - else + if (import_edge.forward) { edge.source = import_edge.source; edge.target = import_edge.target; edge.data.forward = import_edge.forward; edge.data.backward = import_edge.backward; } + else + { + edge.source = import_edge.target; + edge.target = import_edge.source; + edge.data.backward = import_edge.forward; + edge.data.forward = import_edge.backward; + } if (edge.source == edge.target) { @@ -100,12 +99,67 @@ NodeBasedDynamicGraphFromImportEdges(int number_of_nodes, std::vector::max(); + // remove parallel edges + while (i < edges_list.size() && edges_list[i].source == source && edges_list[i].target == target) + { + if (edges_list[i].data.forward) + { + forward_edge.data.distance = + std::min(edges_list[i].data.distance, forward_edge.data.distance); + } + if (edges_list[i].data.backward) + { + reverse_edge.data.distance = + std::min(edges_list[i].data.distance, reverse_edge.data.distance); + } + ++i; + } + // merge edges (s,t) and (t,s) into bidirectional edge + if (forward_edge.data.distance == reverse_edge.data.distance) + { + if ((int)forward_edge.data.distance != std::numeric_limits::max()) + { + forward_edge.data.backward = true; + edges_list[edge_count++] = forward_edge; + } + } + else + { // insert seperate edges + if (((int)forward_edge.data.distance) != std::numeric_limits::max()) + { + edges_list[edge_count++] = forward_edge; + } + if ((int)reverse_edge.data.distance != std::numeric_limits::max()) + { + edges_list[edge_count++] = reverse_edge; + } + } + } + edges_list.resize(edge_count); + SimpleLogger().Write() << "merged " << edges_list.size() - edge_count << " edges out of " << edges_list.size(); + auto graph = std::make_shared(number_of_nodes, edges_list); - - edges_list.clear(); - BOOST_ASSERT(0 == edges_list.size()); - return graph; }