Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

MinSteinerTreeZelikovsky.h
Go to the documentation of this file.
1 
33 #pragma once
34 
35 #include <ogdf/basic/List.h>
45 
46 namespace ogdf {
47 
65 template<typename T>
67 public:
68  template<typename TYPE>
70  template<typename TYPE>
72 
74  enum class WinCalculation {
75  absolute,
76  relative
77  };
78 
80  enum class TripleGeneration {
81  exhaustive,
82  voronoi,
83  ondemand
84  };
85 
87  enum class TripleReduction {
88  on,
89  off
90  };
91 
93  enum class SaveCalculation {
96  staticEnum,
106  hybrid
107  };
108 
110  enum class Pass {
113  one,
115  multi
116  };
117 
122  : m_winCalculation(wc)
123  , m_tripleGeneration(tg)
124  , m_saveCalculation(sc)
125  , m_tripleReduction(tr)
126  , m_pass(pass)
127  , m_ssspDistances(true) { }
128 
130 
131  virtual T call(const EdgeWeightedGraph<T>& G, const List<node>& terminals,
132  const NodeArray<bool>& isTerminal, EdgeWeightedGraphCopy<T>*& finalSteinerTree) override {
133  m_triplesGenerated = 0;
134  m_tripleLookUps = 0;
136  return MinSteinerTreeModule<T>::call(G, terminals, isTerminal, finalSteinerTree);
137  }
138 
144  void forceAPSP(bool force = true) { m_ssspDistances = !force; }
145 
148 
151 
154 
157 
160 
163 
166 
169 
171  void pass(Pass p) { m_pass = p; }
172 
174  Pass pass() const { return m_pass; }
175 
178 
181 
183  long numberOfTripleLookUps() const { return m_tripleLookUps; }
184 
185 protected:
194  virtual T computeSteinerTree(const EdgeWeightedGraph<T>& G, const List<node>& terminals,
195  const NodeArray<bool>& isTerminal, EdgeWeightedGraphCopy<T>*& finalSteinerTree) override;
196 
200  void computeDistanceMatrix();
201 
205  inline void generateTriple(node u, node v, node w, node center, const T& minCost,
206  const Save<T>& save) {
207  const double gain = save.gain(u, v, w);
208  const double win = calcWin(gain, minCost);
209  if (tripleReduction() == TripleReduction::off || win > 0) {
211  OGDF_ASSERT(center);
212  Triple<T> triple(u, v, w, center, minCost, win);
213  m_triples.pushBack(triple);
214  }
215  }
216 
222  inline void generateTriples(const Save<T>& save,
225  [this, &save](node u, node v, node w, node center, T minCost) {
226  generateTriple(u, v, w, center, minCost, save);
227  });
228  }
229 
234  inline void generateTriples(const Save<T>& save) {
238  generateTriples(save, fcg);
239  } else {
242  generateTriples(save, fcg);
243  }
244  }
245 
252  void contractTriple(const Triple<T>& triple, Save<T>& save, NodeArray<bool>& isNewTerminal) {
254  save.update(triple);
255  isNewTerminal[triple.z()] = true;
256  }
257 
263  void tripleOnDemand(Save<T>& save, NodeArray<bool>& isNewTerminal);
264 
272  bool findBestTripleForCenter(node center, const Save<T>& save, Triple<T>& maxTriple) const {
273  bool updated = false; // return value
274 
275  // find s0, nearest terminal to center
276  T best = std::numeric_limits<T>::max();
277  node s0 = nullptr;
278  for (node s : *m_terminals) {
279  T tmp = m_distance[s][center];
280  if (best > tmp) {
281  best = tmp;
282  s0 = s;
283  }
284  }
285  OGDF_ASSERT(s0);
286  OGDF_ASSERT(m_pred[s0][center]);
287 
288  // find s1 maximizing save(s0, s1) - d(center, s1)
289  node s1 = nullptr;
290  T save1Val(0);
291  for (node s : *m_terminals) {
292  if (s != s0 && m_pred[s][center] != nullptr) {
293  OGDF_ASSERT(m_distance[s][center] != std::numeric_limits<T>::max());
294  T tmpVal = save.saveWeight(s, s0);
295  T tmp = tmpVal - m_distance[s][center];
296  if (!s1 || best < tmp) {
297  best = tmp;
298  s1 = s;
299  save1Val = tmpVal;
300  }
301  }
302  }
303  if (s1) {
304  OGDF_ASSERT(m_pred[s1][center]);
305  node s2 = nullptr;
306  T save2Val(0);
307  const edge save1 = save.saveEdge(s0, s1);
308  for (node s : *m_terminals) {
309  if (s != s0 && s != s1 && m_pred[s][center] != nullptr) {
310  OGDF_ASSERT(m_distance[s][center] != std::numeric_limits<T>::max());
311  const edge tmp = save.saveEdge(s0, s);
312  save2Val = save.saveWeight(tmp == save1 ? s1 : s0, s);
313  T tmpWin = save1Val + save2Val - m_distance[s0][center] - m_distance[s1][center]
314  - m_distance[s][center];
315  if (!s2 || best < tmpWin) {
316  best = tmpWin;
317  s2 = s;
318  }
319  }
320  }
321 
322  if (s2 // it may happen that s2 does not exist
323  && best > maxTriple.win()) { // best win is better than previous best; also positive
324  OGDF_ASSERT(m_pred[s2][center]);
325  maxTriple.s0(s0);
326  maxTriple.s1(s1);
327  maxTriple.s2(s2);
328  maxTriple.z(center);
329  maxTriple.win(best);
330  //maxTriple.cost(save1Val + save2Val - win); not needed
331  updated = true;
332  }
333  }
334  return updated;
335  }
336 
342  void multiPass(Save<T>& save, NodeArray<bool>& isNewTerminal);
343 
349  void onePass(Save<T>& save, NodeArray<bool>& isNewTerminal);
350 
354  double calcWin(double gain, T cost) const {
355  switch (winCalculation()) {
357  return gain / cost - 1.0;
359  default:
360  return gain - cost;
361  }
362  }
363 
365  // generate complete graph
366  for (node v : *m_terminals) {
367  steinerTree.newNode(v);
368  }
369  for (node u : steinerTree.nodes) {
370  const NodeArray<T>& dist = m_distance[steinerTree.original(u)];
371  for (node v = u->succ(); v; v = v->succ()) {
372  steinerTree.newEdge(u, v, dist[steinerTree.original(v)]);
373  }
374  }
375  // compute MST
376  makeMinimumSpanningTree(steinerTree, steinerTree.edgeWeights());
377  }
378 
379 private:
386 
393 
397 };
398 
399 template<typename T>
401  const List<node>& terminals, const NodeArray<bool>& isTerminal,
402  EdgeWeightedGraphCopy<T>*& finalSteinerTree) {
403  OGDF_ASSERT(tripleGeneration()
404  != TripleGeneration::ondemand // combinations that only work with ondemand:
405  || (winCalculation() == WinCalculation::absolute
406  && saveCalculation() != SaveCalculation::hybrid && pass() != Pass::one));
407 
408  m_originalGraph = &G;
409  m_terminals = &terminals;
410  m_isTerminal = &isTerminal;
411 
412  // build the complete terminal graph and a distance matrix
413  NodeArray<bool> isNewTerminal(G, false);
414  for (node v : *m_terminals) {
415  isNewTerminal[v] = true;
416  }
417 
418  if (terminals.size() >= 3) {
419  computeDistanceMatrix();
420 
421  // init terminal-spanning tree and its save-edge data structure
422  EdgeWeightedGraphCopy<T> steinerTree; // the terminal-spanning tree to be modified
423  steinerTree.setOriginalGraph(G);
424  generateInitialTerminalSpanningTree(steinerTree);
425 
426  Save<T>* save = nullptr;
427  switch (saveCalculation()) {
428  case SaveCalculation::staticEnum:
429  save = new steiner_tree::SaveEnum<T>(steinerTree);
430  break;
431  case SaveCalculation::staticLCATree:
432  save = new steiner_tree::SaveStatic<T>(steinerTree);
433  break;
434  case SaveCalculation::dynamicLCATree:
435  case SaveCalculation::hybrid:
436  save = new steiner_tree::SaveDynamic<T>(steinerTree);
437  break;
438  }
439  OGDF_ASSERT(save);
440 
441  if (tripleGeneration() == TripleGeneration::ondemand) { // ondemand triple generation
442  tripleOnDemand(*save, isNewTerminal);
443  } else { // exhaustive or voronoi
444  // triple generation phase
445  if (saveCalculation() == SaveCalculation::hybrid) {
446  steiner_tree::SaveEnum<T> saveTriple(steinerTree);
447  generateTriples(saveTriple);
448  } else {
449  generateTriples(*save);
450  }
451  // contraction phase
452  if (pass() == Pass::multi) {
453  multiPass(*save, isNewTerminal);
454  } else { // pass() == one
455  onePass(*save, isNewTerminal);
456  }
457  }
458  delete save;
459 
460  // cleanup
461  m_triples.clear();
462  }
463 
464  // obtain final Steiner Tree using (MST-based) Steiner tree approximation algorithm
465  return steiner_tree::obtainFinalSteinerTree(G, isNewTerminal, isTerminal, finalSteinerTree);
466 }
467 
468 template<typename T>
470  if (m_ssspDistances) {
471  MinSteinerTreeModule<T>::allTerminalShortestPaths(*m_originalGraph, *m_terminals,
472  *m_isTerminal, m_distance, m_pred);
473  } else {
474  MinSteinerTreeModule<T>::allPairShortestPaths(*m_originalGraph, *m_isTerminal, m_distance,
475  m_pred);
476  }
477 }
478 
479 template<typename T>
481  Triple<T> maxTriple;
482  ArrayBuffer<node> nonterminals;
483  MinSteinerTreeModule<T>::getNonterminals(nonterminals, *m_originalGraph, *m_isTerminal);
484  do {
485  maxTriple.win(0);
486  for (node center : nonterminals) {
487  if (findBestTripleForCenter(center, save, maxTriple)) {
488  ++m_triplesGenerated;
489  }
490  }
491 
492  if (maxTriple.win() > 0) {
493  contractTriple(maxTriple, save, isNewTerminal);
494  }
495  } while (maxTriple.win() > 0);
496 }
497 
498 template<typename T>
500  m_triples.quicksort(GenericComparer<Triple<T>, double>(
501  [](const Triple<T>& x) -> double { return -x.win(); }));
502 
503  for (const Triple<T>& t : m_triples) {
504  ++m_tripleLookUps;
505  if (calcWin(double(save.gain(t.s0(), t.s1(), t.s2())), t.cost()) > 0) {
506  contractTriple(t, save, isNewTerminal);
507  }
508  }
509 }
510 
511 template<typename T>
513  double win = 0;
514  ListIterator<Triple<T>> maxTriple;
515 
516  do {
517  win = 0;
518  ListIterator<Triple<T>> nextIt;
519  for (ListIterator<Triple<T>> it = m_triples.begin(); it.valid(); it = nextIt) {
520  nextIt = it.succ();
521  ++m_tripleLookUps;
522  Triple<T>& t = *it;
523  t.win(calcWin(double(save.gain(t.s0(), t.s1(), t.s2())), t.cost()));
524  if (t.win() > win) {
525  win = t.win();
526  maxTriple = it;
527  } else {
528  if (tripleReduction() == TripleReduction::on && t.win() <= 0) {
529  m_triples.del(it);
530  }
531  }
532  }
533 
534  if (win > 0) {
535  contractTriple(*maxTriple, save, isNewTerminal);
536  m_triples.del(maxTriple);
537  }
538  } while (win > 0);
539 }
540 
541 }
ogdf::ArrayBuffer
An array that keeps track of the number of inserted elements; also usable as an efficient stack.
Definition: Array.h:46
ogdf::MinSteinerTreeZelikovsky::~MinSteinerTreeZelikovsky
virtual ~MinSteinerTreeZelikovsky()
Definition: MinSteinerTreeZelikovsky.h:129
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::MinSteinerTreeZelikovsky::numberOfTripleLookUps
long numberOfTripleLookUps() const
Returns the number of triple lookups during execution time.
Definition: MinSteinerTreeZelikovsky.h:183
ogdf::MinSteinerTreeZelikovsky::computeSteinerTree
virtual T computeSteinerTree(const EdgeWeightedGraph< T > &G, const List< node > &terminals, const NodeArray< bool > &isTerminal, EdgeWeightedGraphCopy< T > *&finalSteinerTree) override
Builds a minimum Steiner tree given a weighted graph and a list of terminals.
Definition: MinSteinerTreeZelikovsky.h:400
ogdf::steiner_tree::Triple::win
double win() const
Definition: Triple.h:60
ogdf::MinSteinerTreeModule::allTerminalShortestPaths
static void allTerminalShortestPaths(const EdgeWeightedGraph< T > &G, const List< node > &terminals, const NodeArray< bool > &isTerminal, NodeArray< NodeArray< T >> &distance, NodeArray< NodeArray< edge >> &pred, std::function< void(const EdgeWeightedGraph< T > &, node, const NodeArray< bool > &, NodeArray< T > &, NodeArray< edge > &)> ssspFunc=singleSourceShortestPaths)
Runs a given (or the default) single-source-shortest-paths function from all terminals.
Definition: MinSteinerTreeModule.h:175
ogdf::MinSteinerTreeZelikovsky
This class implements the 11/6-approximation algorithm by Zelikovsky for the minimum Steiner tree pro...
Definition: MinSteinerTreeZelikovsky.h:66
ogdf::steiner_tree::Save::gain
virtual T gain(node u, node v, node w) const =0
Returns the gain (sum of the save edges) of a node triple.
ogdf::MinSteinerTreeZelikovsky::generateTriples
void generateTriples(const Save< T > &save, const steiner_tree::Full3ComponentGeneratorModule< T > &fcg)
Generates triples using the given full 3-component generator.
Definition: MinSteinerTreeZelikovsky.h:222
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::MinSteinerTreeZelikovsky::m_originalGraph
const EdgeWeightedGraph< T > * m_originalGraph
The original edge-weighted graph.
Definition: MinSteinerTreeZelikovsky.h:387
ogdf::MinSteinerTreeZelikovsky::computeDistanceMatrix
void computeDistanceMatrix()
Computes the distance matrix for the original graph.
Definition: MinSteinerTreeZelikovsky.h:469
ogdf::steiner_tree::Save::saveEdge
virtual edge saveEdge(node u, node v) const =0
Returns the save edge between two nodes.
SaveStatic.h
Implementation of the staticLCATree option for calculating save edges in Zelikovsky's 11/6-approximat...
ogdf::MinSteinerTreeZelikovsky::saveCalculation
void saveCalculation(SaveCalculation sv)
Sets type of save calculation.
Definition: MinSteinerTreeZelikovsky.h:165
ogdf::steiner_tree::Full3ComponentGeneratorModule
Interface for full 3-component generation including auxiliary functions.
Definition: Full3ComponentGeneratorModule.h:47
ogdf::MinSteinerTreeZelikovsky::generateTriples
void generateTriples(const Save< T > &save)
Generates triples according to the chosen option.
Definition: MinSteinerTreeZelikovsky.h:234
ogdf::MinSteinerTreeZelikovsky::contractTriple
void contractTriple(const Triple< T > &triple, Save< T > &save, NodeArray< bool > &isNewTerminal)
Contracts a triple and updates the save data structure.
Definition: MinSteinerTreeZelikovsky.h:252
ogdf::steiner_tree::Triple::s2
node s2() const
Definition: Triple.h:54
ogdf::MinSteinerTreeZelikovsky::calcWin
double calcWin(double gain, T cost) const
Calculate the win.
Definition: MinSteinerTreeZelikovsky.h:354
ogdf::EdgeWeightedGraphCopy::setOriginalGraph
void setOriginalGraph(const Graph *wG) override
Associates the graph copy with G, but does not create any nodes or edges.
Definition: EdgeWeightedGraphCopy.h:158
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::MinSteinerTreeZelikovsky::tripleGeneration
TripleGeneration tripleGeneration() const
Returns type of triple generation currently in use.
Definition: MinSteinerTreeZelikovsky.h:156
ogdf::MinSteinerTreeModule::getNonterminals
static void getNonterminals(ArrayBuffer< node > &nonterminals, const EdgeWeightedGraph< T > &G, const NodeArray< bool > &isTerminal)
Generates a list (as ArrayBuffer<node>) of all nonterminals.
Definition: MinSteinerTreeModule.h:328
ogdf::steiner_tree::Triple::s1
node s1() const
Definition: Triple.h:52
ogdf::MinSteinerTreeZelikovsky::pass
Pass pass() const
Returns type of pass currently in use.
Definition: MinSteinerTreeZelikovsky.h:174
ogdf::MinSteinerTreeZelikovsky::onePass
void onePass(Save< T > &save, NodeArray< bool > &isNewTerminal)
Contraction phase for the one pass heuristic.
Definition: MinSteinerTreeZelikovsky.h:499
ogdf::MinSteinerTreeZelikovsky::generateInitialTerminalSpanningTree
void generateInitialTerminalSpanningTree(EdgeWeightedGraphCopy< T > &steinerTree)
Definition: MinSteinerTreeZelikovsky.h:364
ogdf::MinSteinerTreeZelikovsky::m_distance
NodeArray< NodeArray< T > > m_distance
The distance matrix.
Definition: MinSteinerTreeZelikovsky.h:390
ogdf::EdgeWeightedGraphCopy::newEdge
edge newEdge(node u, node v, T weight)
Definition: EdgeWeightedGraphCopy.h:165
ogdf::steiner_tree::Save::saveWeight
virtual T saveWeight(node u, node v) const =0
Returns the weight of the save edge between two nodes.
ogdf::MinSteinerTreeZelikovsky::forceAPSP
void forceAPSP(bool force=true)
For the 3-restricted case, it is sufficient to compute an SSSP from every terminal instead of doing a...
Definition: MinSteinerTreeZelikovsky.h:144
ogdf::MinSteinerTreeZelikovsky::TripleGeneration::exhaustive
@ exhaustive
try all possibilities
ogdf::MinSteinerTreeZelikovsky::call
virtual T call(const EdgeWeightedGraph< T > &G, const List< node > &terminals, const NodeArray< bool > &isTerminal, EdgeWeightedGraphCopy< T > *&finalSteinerTree) override
Calls the Steiner tree algorithm for nontrivial cases but handles trivial cases directly.
Definition: MinSteinerTreeZelikovsky.h:131
ogdf::MinSteinerTreeZelikovsky::SaveCalculation::staticLCATree
@ staticLCATree
Builds a "weight tree" (save edges are inner nodes, terminals are leaves and searches save edges via ...
ogdf::MinSteinerTreeZelikovsky::numberOfContractedTriples
long numberOfContractedTriples() const
Returns the number of contracted triples.
Definition: MinSteinerTreeZelikovsky.h:180
Triple.h
Definition of a Triple used in contraction-based approximation algorithm for the minimum Steiner tree...
ogdf::MinSteinerTreeZelikovsky::Pass::multi
@ multi
normal, greedy version
ogdf::steiner_tree::Save
This class serves as an interface for different approaches concerning the calculation of save edges.
Definition: Save.h:45
SaveEnum.h
Implementation of the staticTree option for calculating save edges in Zelikovsky's 11/6-approximation...
ogdf::MinSteinerTreeZelikovsky::m_winCalculation
WinCalculation m_winCalculation
Chosen option for gain calculation.
Definition: MinSteinerTreeZelikovsky.h:380
ogdf::MinSteinerTreeZelikovsky::winCalculation
void winCalculation(WinCalculation wc)
Sets type of gain calculation.
Definition: MinSteinerTreeZelikovsky.h:147
EdgeWeightedGraphCopy.h
Extends the GraphCopy concept to weighted graphs.
ogdf::MinSteinerTreeZelikovsky::saveCalculation
SaveCalculation saveCalculation() const
Returns type of save calculation currently in use.
Definition: MinSteinerTreeZelikovsky.h:168
ogdf::MinSteinerTreeModule
Serves as an interface for various methods to compute or approximate minimum Steiner trees on undirec...
Definition: MinSteinerTreeModule.h:59
ogdf::MinSteinerTreeZelikovsky::MinSteinerTreeZelikovsky
MinSteinerTreeZelikovsky(WinCalculation wc=WinCalculation::absolute, TripleGeneration tg=TripleGeneration::voronoi, SaveCalculation sc=SaveCalculation::hybrid, TripleReduction tr=TripleReduction::on, Pass pass=Pass::multi)
Definition: MinSteinerTreeZelikovsky.h:118
ogdf::MinSteinerTreeZelikovsky::m_pass
Pass m_pass
Chosen option for pass.
Definition: MinSteinerTreeZelikovsky.h:384
MinSteinerTreeModule.h
Declaration of ogdf::MinSteinerTreeModule.
ogdf::ListIteratorBase::succ
ListIteratorBase< E, isConst, isReverse > succ() const
Returns successor iterator.
Definition: List.h:164
ogdf::MinSteinerTreeZelikovsky::m_saveCalculation
SaveCalculation m_saveCalculation
Chosen option for save calculation.
Definition: MinSteinerTreeZelikovsky.h:382
ogdf::MinSteinerTreeZelikovsky::m_tripleGeneration
TripleGeneration m_tripleGeneration
Chosen option for triple generation.
Definition: MinSteinerTreeZelikovsky.h:381
ogdf::MinSteinerTreeZelikovsky::m_triples
List< Triple< T > > m_triples
The list of triples during the algorithm.
Definition: MinSteinerTreeZelikovsky.h:392
ogdf::steiner_tree::Full3ComponentGeneratorVoronoi
Full 3-component generation using Voronoi regions.
Definition: Full3ComponentGeneratorVoronoi.h:42
ogdf::steiner_tree::SaveEnum
This class computes save edges recursively and stores for every node pair their save edge in a HashAr...
Definition: SaveEnum.h:48
ogdf::Graph::nodes
internal::GraphObjectContainer< NodeElement > nodes
The container containing all node objects.
Definition: Graph_d.h:924
common_algorithms.h
Algorithms used by at least two functions of Steiner tree code or its internal helpers.
ogdf::MinSteinerTreeZelikovsky::findBestTripleForCenter
bool findBestTripleForCenter(node center, const Save< T > &save, Triple< T > &maxTriple) const
Find the best triple for a given nonterminal center.
Definition: MinSteinerTreeZelikovsky.h:272
ogdf::EdgeWeightedGraph
Definition: EdgeWeightedGraph.h:39
ogdf::MinSteinerTreeZelikovsky::Pass::one
@ one
heuristic: evaluate all triples, sort them descending by gain, traverse sorted triples once,...
ogdf::MinSteinerTreeZelikovsky::TripleGeneration::ondemand
@ ondemand
generate triples "on the fly", only usable with WinCalculation::absolute
ogdf::steiner_tree::Full3ComponentGeneratorEnumeration
Full 3-component generation using enumeration.
Definition: Full3ComponentGeneratorEnumeration.h:41
ogdf::GraphCopyBase::newNode
node newNode(node vOrig)
Creates a new node in the graph copy with original node vOrig.
Definition: GraphCopy.h:185
ogdf::MinSteinerTreeZelikovsky::generateTriple
void generateTriple(node u, node v, node w, node center, const T &minCost, const Save< T > &save)
Add a found triple to the triples list.
Definition: MinSteinerTreeZelikovsky.h:205
ogdf::MinSteinerTreeZelikovsky::TripleGeneration::voronoi
@ voronoi
use voronoi regions
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::MinSteinerTreeZelikovsky::m_ssspDistances
bool m_ssspDistances
True iff we only compute SSSP from terminals instead of APSP for full component construction.
Definition: MinSteinerTreeZelikovsky.h:385
ogdf::steiner_tree::Triple::s0
node s0() const
Definition: Triple.h:50
ogdf::MinSteinerTreeZelikovsky::multiPass
void multiPass(Save< T > &save, NodeArray< bool > &isNewTerminal)
Contraction phase for the original version of the algorithm.
Definition: MinSteinerTreeZelikovsky.h:512
ogdf::MinSteinerTreeZelikovsky::m_tripleLookUps
long m_tripleLookUps
Number of triple lookups.
Definition: MinSteinerTreeZelikovsky.h:396
ogdf::steiner_tree::Triple::cost
T cost() const
Definition: Triple.h:58
ogdf::MinSteinerTreeZelikovsky::SaveCalculation::dynamicLCATree
@ dynamicLCATree
Same as staticLCATree but each time a triple has been contracted the "weight tree" is updated dynamic...
ogdf::MinSteinerTreeZelikovsky::m_terminals
const List< node > * m_terminals
List of terminal nodes.
Definition: MinSteinerTreeZelikovsky.h:389
ogdf::MinSteinerTreeModule::call
virtual T call(const EdgeWeightedGraph< T > &G, const List< node > &terminals, const NodeArray< bool > &isTerminal, EdgeWeightedGraphCopy< T > *&finalSteinerTree)
Calls the Steiner tree algorithm for nontrivial cases but handles trivial cases directly.
Definition: MinSteinerTreeModule.h:386
ogdf::steiner_tree::SaveDynamic
Dynamically updatable weighted Tree for determining save edges via LCA computation.
Definition: SaveDynamic.h:50
ogdf::MinSteinerTreeZelikovsky::TripleReduction
TripleReduction
Switches immediate triple dropping.
Definition: MinSteinerTreeZelikovsky.h:87
ogdf::MinSteinerTreeZelikovsky::numberOfGeneratedTriples
long numberOfGeneratedTriples() const
Returns the number of generated triples.
Definition: MinSteinerTreeZelikovsky.h:177
ogdf::MinSteinerTreeZelikovsky::tripleReduction
void tripleReduction(TripleReduction tr)
Sets type of triple reduction.
Definition: MinSteinerTreeZelikovsky.h:159
ogdf::MinSteinerTreeZelikovsky::m_triplesGenerated
long m_triplesGenerated
Number of generated triples.
Definition: MinSteinerTreeZelikovsky.h:394
ogdf::MinSteinerTreeZelikovsky::WinCalculation
WinCalculation
Choice of objective function.
Definition: MinSteinerTreeZelikovsky.h:74
ogdf::EdgeWeightedGraphCopy::edgeWeights
const EdgeArray< T > & edgeWeights() const
Definition: EdgeWeightedGraphCopy.h:61
ogdf::MinSteinerTreeZelikovsky::SaveCalculation
SaveCalculation
Different methods for obtaining save edges.
Definition: MinSteinerTreeZelikovsky.h:93
ogdf::MinSteinerTreeZelikovsky::pass
void pass(Pass p)
Sets type of pass.
Definition: MinSteinerTreeZelikovsky.h:171
ogdf::MinSteinerTreeZelikovsky::SaveCalculation::hybrid
@ hybrid
Uses staticEnum for the triple generation phase (many queries) and dynamicLCATree during the contract...
ogdf::makeMinimumSpanningTree
T makeMinimumSpanningTree(Graph &G, const EdgeArray< T > &weight)
Reduce a graph to its minimum spanning tree (MST) using Kruskal's algorithm.
Definition: extended_graph_alg.h:233
ogdf::NodeElement::succ
node succ() const
Returns the successor in the list of all nodes.
Definition: Graph_d.h:285
ogdf::EdgeWeightedGraphCopy
Definition: EdgeWeightedGraphCopy.h:40
ogdf::MinSteinerTreeZelikovsky::TripleGeneration
TripleGeneration
Choice of triple generation.
Definition: MinSteinerTreeZelikovsky.h:80
ogdf::EdgeElement
Class for the representation of edges.
Definition: Graph_d.h:356
List.h
Declaration of doubly linked lists and iterators.
ogdf::MinSteinerTreeModule::allPairShortestPaths
static void allPairShortestPaths(const EdgeWeightedGraph< T > &G, const NodeArray< bool > &isTerminal, NodeArray< NodeArray< T >> &distance, NodeArray< NodeArray< edge >> &pred)
The default all-pair-shortest-paths algorithm.
Definition: MinSteinerTreeModule.h:229
ogdf::MinSteinerTreeZelikovsky::WinCalculation::relative
@ relative
win=gain/cost
ogdf::steiner_tree::Full3ComponentGeneratorModule::call
virtual void call(const EdgeWeightedGraph< T > &G, const List< node > &terminals, const NodeArray< bool > &isTerminal, const NodeArray< NodeArray< T >> &distance, const NodeArray< NodeArray< edge >> &pred, std::function< void(node, node, node, node, T)> generateFunction) const =0
Generate full components and call generateFunction for each full component.
ogdf::MinSteinerTreeZelikovsky::tripleReduction
TripleReduction tripleReduction() const
Returns type of triple reduction currently in use.
Definition: MinSteinerTreeZelikovsky.h:162
ogdf::MinSteinerTreeZelikovsky::m_isTerminal
const NodeArray< bool > * m_isTerminal
Incidence vector for terminal nodes.
Definition: MinSteinerTreeZelikovsky.h:388
ogdf::List::size
int size() const
Returns the number of elements in the list.
Definition: List.h:1478
SaveDynamic.h
A weighted tree as auxiliary data structure for contraction based algorithms.
Full3ComponentGeneratorEnumeration.h
Definition of ogdf::steiner_tree::Full3ComponentGeneratorEnumeration class template.
ogdf::ListIteratorBase
Encapsulates a pointer to a list element.
Definition: List.h:46
Full3ComponentGeneratorVoronoi.h
Definition of ogdf::steiner_tree::Full3ComponentGeneratorVoronoi class template.
ogdf::MinSteinerTreeZelikovsky::WinCalculation::absolute
@ absolute
win=gain-cost
ogdf::MinSteinerTreeZelikovsky::TripleReduction::on
@ on
removes triples as soon as their gain is known to be non positive
ogdf::MinSteinerTreeZelikovsky::SaveCalculation::staticEnum
@ staticEnum
Stores explicitly the save edge for every pair of terminals. Needs O(n^2) space but has fast query ti...
ogdf::steiner_tree::Triple::z
node z() const
Definition: Triple.h:56
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233
ogdf::MinSteinerTreeZelikovsky::tripleGeneration
void tripleGeneration(TripleGeneration tg)
Sets type of triple generation.
Definition: MinSteinerTreeZelikovsky.h:153
ogdf::MinSteinerTreeZelikovsky::Pass
Pass
Enables a heuristic version (for TG exhaustive and voronoi only)
Definition: MinSteinerTreeZelikovsky.h:110
ogdf::GenericComparer
Compare elements based on a single comparable attribute.
Definition: comparer.h:398
ogdf::steiner_tree::SaveStatic
This class behaves basically the same as SaveDynamic except that the update of the weighted graph is ...
Definition: SaveStatic.h:48
ogdf::steiner_tree::Save::update
virtual void update(const Triple< T > &t)=0
Updates the weighted tree data structure given a contracted triple.
ogdf::GraphCopyBase::original
const Graph & original() const
Returns a reference to the original graph.
Definition: GraphCopy.h:98
ogdf::MinSteinerTreeZelikovsky::TripleReduction::off
@ off
keeps triples all the time
ogdf::MinSteinerTreeZelikovsky::winCalculation
WinCalculation winCalculation() const
Returns type of gain calculation currently in use.
Definition: MinSteinerTreeZelikovsky.h:150
ogdf::MinSteinerTreeZelikovsky::m_tripleReduction
TripleReduction m_tripleReduction
Chosen option for triple reduction.
Definition: MinSteinerTreeZelikovsky.h:383
ogdf::MinSteinerTreeZelikovsky::tripleOnDemand
void tripleOnDemand(Save< T > &save, NodeArray< bool > &isNewTerminal)
Contraction phase for algorithm generating triples on demand.
Definition: MinSteinerTreeZelikovsky.h:480
ogdf::MinSteinerTreeZelikovsky::m_pred
NodeArray< NodeArray< edge > > m_pred
The predecessor matrix.
Definition: MinSteinerTreeZelikovsky.h:391
ogdf::MinSteinerTreeZelikovsky::m_triplesContracted
long m_triplesContracted
Number of contracted triples.
Definition: MinSteinerTreeZelikovsky.h:395