Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

SaveStatic.h
Go to the documentation of this file.
1 
33 #pragma once
34 
38 #include <ogdf/tree/LCA.h>
39 
40 namespace ogdf {
41 namespace steiner_tree {
42 
47 template<typename T>
48 class SaveStatic : public Save<T> {
49 public:
50  explicit SaveStatic(EdgeWeightedGraphCopy<T>& steinerTree)
51  : Save<T>()
52  , m_tree()
53  , m_treeEdge(m_tree, nullptr)
54  , m_steinerTree(&steinerTree)
55  , m_cTerminals(*m_steinerTree, nullptr) {
57  m_lca = new LCA(m_tree, m_root);
58  }
59 
60  virtual ~SaveStatic() { delete m_lca; }
61 
68  virtual T saveWeight(node u, node v) const { return m_steinerTree->weight(saveEdge(u, v)); }
69 
76  virtual edge saveEdge(node u, node v) const {
77  OGDF_ASSERT(m_steinerTree->copy(u));
78  OGDF_ASSERT(m_steinerTree->copy(v));
79  node anc = lca(m_steinerTree->copy(u), m_steinerTree->copy(v));
80  OGDF_ASSERT(anc);
81  return m_treeEdge[anc];
82  }
83 
91  virtual T gain(node u, node v, node w) const {
92  node save0 = lca(m_steinerTree->copy(u), m_steinerTree->copy(v));
93  node save1 = lca(m_steinerTree->copy(u), m_steinerTree->copy(w));
94  if (save0 == save1) {
95  save1 = lca(m_steinerTree->copy(v), m_steinerTree->copy(w));
96  }
97  return (save0 ? m_steinerTree->weight(m_treeEdge[save0]) : 0)
98  + (save1 ? m_steinerTree->weight(m_treeEdge[save1]) : 0);
99  }
100 
104  void rebuild() {
105  m_tree.clear();
106  m_cTerminals.fill(nullptr);
108  delete m_lca;
109  m_lca = new LCA(m_tree, m_root);
110  }
111 
120  virtual void update(const Triple<T>& t) {
121  const edge save0 = saveEdge(t.s0(), t.s1());
122  const edge save1 = saveEdge(t.s0(), t.s2());
123  const edge save2 = saveEdge(t.s1(), t.s2());
124  contractTripleInSteinerTree(t, *m_steinerTree, save0, save1, save2);
125 
126  rebuild();
127  }
128 
135  node lca(node u, node v) const { return m_lca->call(m_cTerminals[u], m_cTerminals[v]); }
136 
137 protected:
138 private:
145 };
146 
147 }
148 }
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
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::steiner_tree::SaveStatic::saveEdge
virtual edge saveEdge(node u, node v) const
Determines the save edge between two nodes by a LCA query.
Definition: SaveStatic.h:76
ogdf::steiner_tree::SaveStatic::saveWeight
virtual T saveWeight(node u, node v) const
Determines the weight of the save edge between two nodes by a LCA query.
Definition: SaveStatic.h:68
ogdf::steiner_tree::Triple::s2
node s2() const
Definition: Triple.h:54
ogdf::steiner_tree::SaveStatic::SaveStatic
SaveStatic(EdgeWeightedGraphCopy< T > &steinerTree)
Definition: SaveStatic.h:50
ogdf::steiner_tree::SaveStatic::rebuild
void rebuild()
Rebuild the data structure (necessary if the tree has changed)
Definition: SaveStatic.h:104
ogdf::steiner_tree::Triple::s1
node s1() const
Definition: Triple.h:52
ogdf::steiner_tree::SaveStatic::m_lca
LCA * m_lca
The LCA data structure for m_tree.
Definition: SaveStatic.h:143
ogdf::LCA::call
node call(node u, node v) const
Returns the LCA of two nodes u and v.
Triple.h
Definition of a Triple used in contraction-based approximation algorithm for the minimum Steiner tree...
ogdf::steiner_tree::Save
This class serves as an interface for different approaches concerning the calculation of save edges.
Definition: Save.h:45
ogdf::steiner_tree::SaveStatic::gain
virtual T gain(node u, node v, node w) const
Returns the gain (sum of the save edges) of a node triple by an LCA query.
Definition: SaveStatic.h:91
ogdf::steiner_tree::SaveStatic::update
virtual void update(const Triple< T > &t)
Updates the weighted tree data structure given a contracted triple.
Definition: SaveStatic.h:120
ogdf::steiner_tree::SaveStatic::lca
node lca(node u, node v) const
Returns the node corresponding to the LCA between two given nodes.
Definition: SaveStatic.h:135
LCA.h
The Sparse Table Algorithm for the Least Common Ancestor problem as proposed by Bender and Farach-Col...
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::clear
virtual void clear()
Removes all nodes and all edges from the graph.
common_algorithms.h
Algorithms used by at least two functions of Steiner tree code or its internal helpers.
ogdf::steiner_tree::SaveStatic::m_cTerminals
NodeArray< node > m_cTerminals
Definition: SaveStatic.h:144
ogdf::steiner_tree::SaveStatic::~SaveStatic
virtual ~SaveStatic()
Definition: SaveStatic.h:60
ogdf::steiner_tree::SaveStatic::m_steinerTree
EdgeWeightedGraphCopy< T > * m_steinerTree
A pointer to the tree we represent the save for.
Definition: SaveStatic.h:141
ogdf::internal::GraphRegisteredArray
RegisteredArray for nodes, edges and adjEntries of a graph.
Definition: Graph_d.h:651
ogdf::LCA
Implements the <O(n log n), O(1)>-time "sparse table" algorithm by Bender and Farach-Colton to comput...
Definition: LCA.h:52
ogdf::Graph
Data type for general directed graphs (adjacency list representation).
Definition: Graph_d.h:862
ogdf::steiner_tree::SaveStatic::m_root
node m_root
The root of m_tree.
Definition: SaveStatic.h:142
ogdf::steiner_tree::Triple::s0
node s0() const
Definition: Triple.h:50
ogdf::steiner_tree::SaveStatic::m_tree
Graph m_tree
The weighted binary tree to represent the edge weight hierarchy.
Definition: SaveStatic.h:139
ogdf::steiner_tree::SaveStatic::m_treeEdge
NodeArray< edge > m_treeEdge
Maps each inner node of m_tree to an edge in m_steinerTree.
Definition: SaveStatic.h:140
ogdf::EdgeWeightedGraphCopy
Definition: EdgeWeightedGraphCopy.h:40
ogdf::EdgeElement
Class for the representation of edges.
Definition: Graph_d.h:356
Save.h
Interface for various LCA methods.
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233
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