Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

common_algorithms.h
Go to the documentation of this file.
1 
33 #pragma once
34 
37 
38 //#define OGDF_COMMON_ALG_FIND_BEST_TAKAHASHI_ROOT
39 
40 
41 namespace ogdf {
42 namespace steiner_tree {
43 
52 template<typename T>
54  NodeArray<node>& externalNodes,
55  NodeArray<edge>& treeEdge,
56  Graph& outputTree)
57 {
58  // sort edges by weight
59  Array<Prioritized<edge, T>> sortEdges(inputTree.numberOfEdges());
60  int i = 0;
61  for (edge e : inputTree.edges) {
62  sortEdges[i] = Prioritized<edge, T>(e, inputTree.weight(e));
63  ++i;
64  }
65  sortEdges.quicksort();
66 
67  // insert edges into forest (which in the end makes up a tree)
68  NodeArray<node*> root(outputTree);
69  List<node*> garbage;
70  node edgeNode = nullptr;
71  for (i = 0; i < inputTree.numberOfEdges(); ++i) {
72  edgeNode = outputTree.newNode();
73  edge e = sortEdges[i].item();
74  treeEdge[edgeNode] = e;
75 
76  node u = e->source();
77  node v = e->target();
78  if (externalNodes[u]) {
79  node* uRoot = root[externalNodes[u]];
80  OGDF_ASSERT(uRoot);
81  while (root[*uRoot] != uRoot) {
82  *uRoot = *root[*uRoot];
83  uRoot = root[*uRoot];
84  OGDF_ASSERT(uRoot);
85  }
86  outputTree.newEdge(edgeNode, *uRoot);
87  root[edgeNode] = uRoot;
88  if (externalNodes[v]) {
89  node* vRoot = root[externalNodes[v]];
90  OGDF_ASSERT(vRoot);
91  while (root[*vRoot] != vRoot) {
92  *vRoot = *root[*vRoot];
93  vRoot = root[*vRoot];
94  OGDF_ASSERT(vRoot);
95  }
96  outputTree.newEdge(edgeNode, *vRoot);
97  *vRoot = edgeNode;
98  } else {
99  externalNodes[v] = edgeNode;
100  }
101  } else {
102  externalNodes[u] = edgeNode;
103  if (externalNodes[v]) {
104  node* vRoot = root[externalNodes[v]];
105  OGDF_ASSERT(vRoot);
106  while (root[*vRoot] != vRoot) {
107  *vRoot = *root[*vRoot];
108  vRoot = root[*vRoot];
109  OGDF_ASSERT(vRoot);
110  }
111  outputTree.newEdge(edgeNode, *vRoot);
112  root[edgeNode] = vRoot;
113  } else {
114  root[edgeNode] = new node;
115  garbage.pushBack(root[edgeNode]);
116  externalNodes[v] = edgeNode;
117  }
118  }
119  *root[edgeNode] = edgeNode;
120  }
121  OGDF_ASSERT(edgeNode);
122 
123  // garbage collect
124  for (node* p : garbage) {
125  delete p;
126  }
127 
128  return edgeNode;
129 }
130 
142 template<typename T>
144  edge save1, edge save2, edge& ne0, edge& ne1) {
145  if (save0 == save1) {
146  st.delEdge(save1);
147  st.delEdge(save2);
148  } else {
149  st.delEdge(save0);
150  st.delEdge(save1);
151  }
152  ne0 = st.newEdge(st.copy(t.s0()), st.copy(t.s1()), 0);
153  ne1 = st.newEdge(st.copy(t.s0()), st.copy(t.s2()), 0);
154 }
155 
156 template<typename T>
158  edge e1, edge e2) {
159  edge ne0, ne1;
160  contractTripleInSteinerTree(t, st, e0, e1, e2, ne0, ne1);
161 }
162 
163 template<typename T>
165  const NodeArray<bool>& isOriginalTerminal, EdgeWeightedGraphCopy<T>*& finalSteinerTree) {
166  List<node> terminals;
167  MinSteinerTreeModule<T>::getTerminals(terminals, G, isTerminal);
168 
169  finalSteinerTree = nullptr;
171 #ifdef OGDF_COMMON_ALG_FIND_BEST_TAKAHASHI_ROOT
172  // find minimum Steiner tree of G among Takahashi approximations for each start node
173  T bestMstWeight = std::numeric_limits<T>::max();
174  for (node v : terminals) {
175  EdgeWeightedGraphCopy<T>* tmpSteinerTree;
176  T tmpMstWeight = mstt.call(G, terminals, isTerminal, isOriginalTerminal, tmpSteinerTree, v);
177  if (tmpMstWeight < bestMstWeight) {
178  bestMstWeight = tmpMstWeight;
179  delete finalSteinerTree;
180  finalSteinerTree = tmpSteinerTree;
181  } else {
182  delete tmpSteinerTree;
183  }
184  }
185  return bestMstWeight;
186 #else
187  return mstt.call(G, terminals, isTerminal, isOriginalTerminal, finalSteinerTree);
188 #endif
189 }
190 
191 }
192 }
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
MinSteinerTreeTakahashi.h
Implementation of the 2(1-1/l)-approximation algorithm for the minimum Steiner tree problem by Matsuy...
ogdf::steiner_tree::contractTripleInSteinerTree
void contractTripleInSteinerTree(const Triple< T > &t, EdgeWeightedGraphCopy< T > &st, edge save0, edge save1, edge save2, edge &ne0, edge &ne1)
Updates the Steiner tree by deleting save edges, removing all direct connections between the terminal...
Definition: common_algorithms.h:143
ogdf::steiner_tree::Triple
This class represents a triple used by various contraction-based minimum Steiner tree approximations.
Definition: Triple.h:44
OGDF_ASSERT
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition: basic.h:54
ogdf::MinSteinerTreeTakahashi::call
virtual T call(const EdgeWeightedGraph< T > &G, const List< node > &terminals, const NodeArray< bool > &isTerminal, EdgeWeightedGraphCopy< T > *&finalSteinerTree, const node startNode)
An extended call method with specific start node.
Definition: MinSteinerTreeTakahashi.h:70
ogdf::steiner_tree::Triple::s2
node s2() const
Definition: Triple.h:54
ogdf::steiner_tree::obtainFinalSteinerTree
T obtainFinalSteinerTree(const EdgeWeightedGraph< T > &G, const NodeArray< bool > &isTerminal, const NodeArray< bool > &isOriginalTerminal, EdgeWeightedGraphCopy< T > *&finalSteinerTree)
Definition: common_algorithms.h:164
ogdf::steiner_tree::Triple::s1
node s1() const
Definition: Triple.h:52
ogdf::EdgeWeightedGraphCopy::newEdge
edge newEdge(node u, node v, T weight)
Definition: EdgeWeightedGraphCopy.h:165
EdgeWeightedGraphCopy.h
Extends the GraphCopy concept to weighted graphs.
ogdf::steiner_tree::buildHeaviestEdgeInComponentTree
node buildHeaviestEdgeInComponentTree(const EdgeWeightedGraphCopy< T > &inputTree, NodeArray< node > &externalNodes, NodeArray< edge > &treeEdge, Graph &outputTree)
Given an edge-weighted tree, builds an auxiliary arborescence where each arc of the input tree is a n...
Definition: common_algorithms.h:53
ogdf::Graph::numberOfEdges
int numberOfEdges() const
Returns the number of edges in the graph.
Definition: Graph_d.h:977
ogdf::EdgeWeightedGraph
Definition: EdgeWeightedGraph.h:39
ogdf::Array
The parameterized class Array implements dynamic arrays of type E.
Definition: Array.h:214
ogdf::EdgeElement::source
node source() const
Returns the source node of the edge.
Definition: Graph_d.h:391
ogdf::node
NodeElement * node
The type of nodes.
Definition: Graph_d.h:63
ogdf::List
Doubly linked lists (maintaining the length of the list).
Definition: List.h:42
ogdf::internal::GraphRegisteredArray
RegisteredArray for nodes, edges and adjEntries of a graph.
Definition: Graph_d.h:651
ogdf::Graph
Data type for general directed graphs (adjacency list representation).
Definition: Graph_d.h:862
ogdf::steiner_tree::Triple::s0
node s0() const
Definition: Triple.h:50
ogdf::GraphCopy::copy
edge copy(edge e) const override
Returns the first edge in the list of edges corresponding to edge e.
Definition: GraphCopy.h:457
ogdf::GraphCopy::delEdge
void delEdge(edge e) override
Removes edge e and clears the list of edges corresponding to e's original edge.
ogdf::Graph::edges
internal::GraphObjectContainer< EdgeElement > edges
The container containing all edge objects.
Definition: Graph_d.h:927
ogdf::MinSteinerTreeTakahashi
This class implements the minimum Steiner tree 2-approximation algorithm by Takahashi and Matsuyama w...
Definition: MinSteinerTreeTakahashi.h:57
ogdf::Graph::newNode
node newNode(int index=-1)
Creates a new node and returns it.
Definition: Graph_d.h:1056
ogdf::EdgeWeightedGraphCopy::weight
T weight(const edge e) const
Definition: EdgeWeightedGraphCopy.h:57
ogdf::EdgeWeightedGraphCopy
Definition: EdgeWeightedGraphCopy.h:40
ogdf::Prioritized
Augments any data elements of type X with keys of type Priority. This class is also its own Comparer.
Definition: comparer.h:291
ogdf::EdgeElement
Class for the representation of edges.
Definition: Graph_d.h:356
ogdf::Array::quicksort
void quicksort()
Sorts array using Quicksort.
Definition: Array.h:634
ogdf::MinSteinerTreeModule::getTerminals
static void getTerminals(List< node > &terminals, const EdgeWeightedGraph< T > &G, const NodeArray< bool > &isTerminal)
Generates a list (as List<node>) of all terminals.
Definition: MinSteinerTreeModule.h:307
ogdf::EdgeElement::target
node target() const
Returns the target node of the edge.
Definition: Graph_d.h:394
ogdf::Graph::newEdge
edge newEdge(node v, node w, int index=-1)
Creates a new edge (v,w) and returns it.
Definition: Graph_d.h:1075
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233
ogdf::List::pushBack
iterator pushBack(const E &x)
Adds element x at the end of the list.
Definition: List.h:1537