Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

Loading...
Searching...
No Matches
SaveStatic.h
Go to the documentation of this file.
1
33#pragma once
34
35#include <ogdf/basic/Graph.h>
36#include <ogdf/basic/basic.h>
39#include <ogdf/tree/LCA.h>
40
41namespace ogdf::steiner_tree {
42template<typename T>
43class Triple;
44} // namespace ogdf::steiner_tree
45
46namespace ogdf {
47template<typename T>
48class EdgeWeightedGraphCopy;
49
50namespace steiner_tree {
51
56template<typename T>
57class SaveStatic : public Save<T> {
58public:
59 explicit SaveStatic(EdgeWeightedGraphCopy<T>& steinerTree)
60 : Save<T>()
61 , m_tree()
62 , m_treeEdge(m_tree, nullptr)
63 , m_steinerTree(&steinerTree)
64 , m_cTerminals(*m_steinerTree, nullptr) {
66 m_lca = new LCA(m_tree, m_root);
67 }
68
69 virtual ~SaveStatic() { delete m_lca; }
70
77 virtual T saveWeight(node u, node v) const { return m_steinerTree->weight(saveEdge(u, v)); }
78
85 virtual edge saveEdge(node u, node v) const {
86 OGDF_ASSERT(m_steinerTree->copy(u));
87 OGDF_ASSERT(m_steinerTree->copy(v));
88 node anc = lca(m_steinerTree->copy(u), m_steinerTree->copy(v));
89 OGDF_ASSERT(anc);
90 return m_treeEdge[anc];
91 }
92
100 virtual T gain(node u, node v, node w) const {
101 node save0 = lca(m_steinerTree->copy(u), m_steinerTree->copy(v));
102 node save1 = lca(m_steinerTree->copy(u), m_steinerTree->copy(w));
103 if (save0 == save1) {
104 save1 = lca(m_steinerTree->copy(v), m_steinerTree->copy(w));
105 }
106 return (save0 ? m_steinerTree->weight(m_treeEdge[save0]) : 0)
107 + (save1 ? m_steinerTree->weight(m_treeEdge[save1]) : 0);
108 }
109
113 void rebuild() {
114 m_tree.clear();
115 m_cTerminals.fill(nullptr);
117 delete m_lca;
118 m_lca = new LCA(m_tree, m_root);
119 }
120
129 virtual void update(const Triple<T>& t) {
130 const edge save0 = saveEdge(t.s0(), t.s1());
131 const edge save1 = saveEdge(t.s0(), t.s2());
132 const edge save2 = saveEdge(t.s1(), t.s2());
133 contractTripleInSteinerTree(t, *m_steinerTree, save0, save1, save2);
134
135 rebuild();
136 }
137
144 node lca(node u, node v) const { return m_lca->call(m_cTerminals[u], m_cTerminals[v]); }
145
146protected:
147private:
154};
155
156}
157}
Includes declaration of graph class.
The Sparse Table Algorithm for the Least Common Ancestor problem as proposed by Bender and Farach-Col...
Interface for various LCA methods.
Basic declarations, included by all source files.
Class for the representation of edges.
Definition Graph_d.h:364
Data type for general directed graphs (adjacency list representation).
Definition Graph_d.h:866
virtual void clear()
Removes all nodes and all edges from the graph.
Implements the <O(n log n), O(1)>-time "sparse table" algorithm by Bender and Farach-Colton to comput...
Definition LCA.h:54
node call(node u, node v) const
Returns the LCA of two nodes u and v.
Class for the representation of nodes.
Definition Graph_d.h:241
RegisteredArray for nodes, edges and adjEntries of a graph.
Definition Graph_d.h:659
This class serves as an interface for different approaches concerning the calculation of save edges.
Definition Save.h:50
This class behaves basically the same as SaveDynamic except that the update of the weighted graph is ...
Definition SaveStatic.h:57
EdgeWeightedGraphCopy< T > * m_steinerTree
A pointer to the tree we represent the save for.
Definition SaveStatic.h:150
node m_root
The root of m_tree.
Definition SaveStatic.h:151
SaveStatic(EdgeWeightedGraphCopy< T > &steinerTree)
Definition SaveStatic.h:59
void rebuild()
Rebuild the data structure (necessary if the tree has changed)
Definition SaveStatic.h:113
LCA * m_lca
The LCA data structure for m_tree.
Definition SaveStatic.h:152
NodeArray< edge > m_treeEdge
Maps each inner node of m_tree to an edge in m_steinerTree.
Definition SaveStatic.h:149
virtual void update(const Triple< T > &t)
Updates the weighted tree data structure given a contracted triple.
Definition SaveStatic.h:129
NodeArray< node > m_cTerminals
Definition SaveStatic.h:153
node lca(node u, node v) const
Returns the node corresponding to the LCA between two given nodes.
Definition SaveStatic.h:144
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:100
Graph m_tree
The weighted binary tree to represent the edge weight hierarchy.
Definition SaveStatic.h:148
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:77
virtual edge saveEdge(node u, node v) const
Determines the save edge between two nodes by a LCA query.
Definition SaveStatic.h:85
This class represents a triple used by various contraction-based minimum Steiner tree approximations.
Definition Triple.h:44
Algorithms used by at least two functions of Steiner tree code or its internal helpers.
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition basic.h:52
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...
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...
The namespace for all OGDF objects.