Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

MinSteinerTreeTakahashi.h
Go to the documentation of this file.
1 
33 #pragma once
34 
35 #include <ogdf/basic/List.h>
39 
40 namespace ogdf {
41 
56 template<typename T>
58 public:
60 
62 
70  virtual T call(const EdgeWeightedGraph<T>& G, const List<node>& terminals,
71  const NodeArray<bool>& isTerminal, EdgeWeightedGraphCopy<T>*& finalSteinerTree,
72  const node startNode) {
73  return call(G, terminals, isTerminal, isTerminal, finalSteinerTree, startNode);
74  }
75 
83  virtual T call(const EdgeWeightedGraph<T>& G, const List<node>& terminals,
84  const NodeArray<bool>& isTerminal, const NodeArray<bool>& isOriginalTerminal,
85  EdgeWeightedGraphCopy<T>*& finalSteinerTree) {
86  return call(G, terminals, isTerminal, isOriginalTerminal, finalSteinerTree,
87  terminals.front());
88  }
89 
91 
100  virtual T call(const EdgeWeightedGraph<T>& G, const List<node>& terminals,
101  const NodeArray<bool>& isTerminal, const NodeArray<bool>& isOriginalTerminal,
102  EdgeWeightedGraphCopy<T>*& finalSteinerTree, const node startNode);
103 
104 protected:
105  virtual T computeSteinerTree(const EdgeWeightedGraph<T>& G, const List<node>& terminals,
106  const NodeArray<bool>& isTerminal, EdgeWeightedGraphCopy<T>*& finalSteinerTree) override {
107  return call(G, terminals, isTerminal, isTerminal, finalSteinerTree, terminals.front());
108  }
109 
120  EdgeWeightedGraphCopy<T>& intermediateTerminalSpanningTree, const node s,
121  int numberOfTerminals, const NodeArray<bool>& isTerminal);
122 };
123 
124 template<typename T>
126  const NodeArray<bool>& isTerminal, const NodeArray<bool>& isOriginalTerminal,
127  EdgeWeightedGraphCopy<T>*& finalSteinerTree, const node startNode) {
129 
130  EdgeWeightedGraphCopy<T> terminalSpanningTree;
131  terminalSpanningTree.setOriginalGraph(G);
132  terminalDijkstra(G, terminalSpanningTree, startNode, terminals.size(), isTerminal);
133 
134  finalSteinerTree = new EdgeWeightedGraphCopy<T>(G);
135  for (node u : G.nodes) {
136  if (!terminalSpanningTree.copy(u)) {
137  finalSteinerTree->delNode(finalSteinerTree->copy(u));
138  }
139  }
140 
141  T mstWeight = makeMinimumSpanningTree(*finalSteinerTree, finalSteinerTree->edgeWeights());
142  mstWeight -= MinSteinerTreeModule<T>::pruneAllDanglingSteinerPaths(*finalSteinerTree,
143  isOriginalTerminal);
144 
145  return mstWeight;
146 }
147 
148 template<typename T>
150  EdgeWeightedGraphCopy<T>& intermediateTerminalSpanningTree, const node s,
151  int numberOfTerminals, const NodeArray<bool>& isTerminal) {
152  NodeArray<edge> predecessor(wG, nullptr);
153  NodeArray<T> distance(wG, std::numeric_limits<T>::max());
154  distance[s] = 0;
155  NodeArray<T> bestDistance(wG, std::numeric_limits<T>::max());
156  bestDistance[s] = 0;
157  NodeArray<bool> isInQueue(wG, true);
158 
159  PrioritizedMapQueue<node, T> queue(wG); //priority queue
160  for (node v : wG.nodes) {
161  queue.push(v, distance[v]);
162  }
163 
164  T mstWeight = 0;
165  int terminalsFound = 1;
166  while (!queue.empty() && terminalsFound < numberOfTerminals) {
167  node v = queue.topElement();
168  queue.pop();
169  isInQueue[v] = false;
170  bestDistance[v] = distance[v];
171  if (isTerminal[v] && distance[v] > 0) {
172  ++terminalsFound;
173  // insert path from new node to old tree
174  node tmpT = intermediateTerminalSpanningTree.newNode(v);
175  while (distance[v] > 0) {
176  distance[v] = 0;
177  queue.push(v, distance[v]);
178  isInQueue[v] = true;
179  const edge e = predecessor[v];
180  OGDF_ASSERT(e);
181  const node w = e->opposite(v);
182  node tmpS = intermediateTerminalSpanningTree.copy(w);
183  if (!tmpS) {
184  tmpS = intermediateTerminalSpanningTree.newNode(w);
185  }
186  edge tmpE;
187  if (e->target() == v) {
188  tmpE = intermediateTerminalSpanningTree.newEdge(tmpS, tmpT, wG.weight(e));
189  } else {
190  tmpE = intermediateTerminalSpanningTree.newEdge(tmpT, tmpS, wG.weight(e));
191  }
192  mstWeight += wG.weight(e);
193  intermediateTerminalSpanningTree.setEdge(e, tmpE);
194  tmpT = tmpS;
195  v = w;
196  }
197  } else { // !isTerminal[v] || distance[v] == 0
198  for (adjEntry adj : v->adjEntries) {
199  const node w = adj->twinNode();
200  const edge e = adj->theEdge();
201  if (distance[w] > distance[v] + wG.weight(e) && bestDistance[w] >= distance[w]) {
202  distance[w] = distance[v] + wG.weight(e);
203  if (!isInQueue[w]) {
204  queue.push(w, distance[w]);
205  isInQueue[w] = true;
206  } else {
207  queue.decrease(w, distance[w]);
208  }
209  predecessor[w] = e;
210  }
211  }
212  }
213  }
214  return mstWeight;
215 }
216 
217 }
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
OGDF_ASSERT
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition: basic.h:54
ogdf::pq_internal::PrioritizedArrayQueueBase< E, P, std::less< P >, PairingHeap, HashArray< E, PrioritizedQueue< E, P, std::less< P >, PairingHeap >::Handle, DefHashFunc< E > > >::pop
void pop()
Removes the topmost element from the queue.
Definition: PriorityQueue.h:339
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::EdgeWeightedGraph::weight
T weight(const edge e) const
Definition: EdgeWeightedGraph.h:58
ogdf::pq_internal::PrioritizedArrayQueueBase< E, P, std::less< P >, PairingHeap, HashArray< E, PrioritizedQueue< E, P, std::less< P >, PairingHeap >::Handle, DefHashFunc< E > > >::push
void push(const E &element, const P &priority)
Adds a new element to the queue.
Definition: PriorityQueue.h:331
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
extended_graph_alg.h
Declaration of extended graph algorithms.
ogdf::EdgeWeightedGraphCopy::newEdge
edge newEdge(node u, node v, T weight)
Definition: EdgeWeightedGraphCopy.h:165
ogdf::MinSteinerTreeTakahashi::call
virtual T call(const EdgeWeightedGraph< T > &G, const List< node > &terminals, const NodeArray< bool > &isTerminal, const NodeArray< bool > &isOriginalTerminal, EdgeWeightedGraphCopy< T > *&finalSteinerTree)
An extended call method with intermediate and final (original) terminals.
Definition: MinSteinerTreeTakahashi.h:83
ogdf::isConnected
bool isConnected(const Graph &G)
Returns true iff G is connected.
ogdf::AdjElement
Class for adjacency list elements.
Definition: Graph_d.h:135
EdgeWeightedGraphCopy.h
Extends the GraphCopy concept to weighted graphs.
ogdf::MinSteinerTreeModule
Serves as an interface for various methods to compute or approximate minimum Steiner trees on undirec...
Definition: MinSteinerTreeModule.h:59
MinSteinerTreeModule.h
Declaration of ogdf::MinSteinerTreeModule.
ogdf::AdjElement::theEdge
edge theEdge() const
Returns the edge associated with this adjacency entry.
Definition: Graph_d.h:153
ogdf::PriorityQueue::empty
bool empty() const
Checks whether the queue is empty.
Definition: PriorityQueue.h:209
ogdf::Graph::nodes
internal::GraphObjectContainer< NodeElement > nodes
The container containing all node objects.
Definition: Graph_d.h:924
ogdf::EdgeWeightedGraph
Definition: EdgeWeightedGraph.h:39
ogdf::PrioritizedMapQueue
Prioritized queue interface wrapper for heaps.
Definition: PriorityQueue.h:409
ogdf::NodeElement::adjEntries
internal::GraphObjectContainer< AdjElement > adjEntries
The container containing all entries in the adjacency list of this node.
Definition: Graph_d.h:264
ogdf::MinSteinerTreeModule::pruneAllDanglingSteinerPaths
static T pruneAllDanglingSteinerPaths(EdgeWeightedGraphCopy< T > &steinerTree, const NodeArray< bool > &isTerminal)
Prunes nonterminal leaves and their paths to terminal or branching nodes.
Definition: MinSteinerTreeModule.h:488
ogdf::GraphCopyBase::newNode
node newNode(node vOrig)
Creates a new node in the graph copy with original node vOrig.
Definition: GraphCopy.h:185
ogdf::MinSteinerTreeTakahashi::MinSteinerTreeTakahashi
MinSteinerTreeTakahashi()
Definition: MinSteinerTreeTakahashi.h:59
ogdf::MinSteinerTreeTakahashi::terminalDijkstra
T terminalDijkstra(const EdgeWeightedGraph< T > &wG, EdgeWeightedGraphCopy< T > &intermediateTerminalSpanningTree, const node s, int numberOfTerminals, const NodeArray< bool > &isTerminal)
Modified Dijkstra algorithm to solve the Minimum Steiner Tree problem.
Definition: MinSteinerTreeTakahashi.h:149
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::GraphCopyBase::delNode
void delNode(node v) override
Removes node v.
Definition: GraphCopy.h:200
ogdf::pq_internal::PrioritizedQueue< E, P, std::less< P >, PairingHeap >::topElement
const E & topElement() const
Returns the topmost element in the queue.
Definition: PriorityQueue.h:284
ogdf::AdjElement::twinNode
node twinNode() const
Returns the associated node of the corresponding adjacency entry (shorthand for twin()->theNode()).
Definition: Graph_d.h:168
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::setEdge
void setEdge(edge eOrig, edge eCopy)
sets eOrig to be the corresponding original edge of eCopy and vice versa
ogdf::pq_internal::PrioritizedArrayQueueBase< E, P, std::less< P >, PairingHeap, HashArray< E, PrioritizedQueue< E, P, std::less< P >, PairingHeap >::Handle, DefHashFunc< E > > >::decrease
void decrease(const E &element, const P &priority)
Decreases the priority of the given element.
Definition: PriorityQueue.h:349
ogdf::MinSteinerTreeTakahashi
This class implements the minimum Steiner tree 2-approximation algorithm by Takahashi and Matsuyama w...
Definition: MinSteinerTreeTakahashi.h:57
ogdf::EdgeWeightedGraphCopy::edgeWeights
const EdgeArray< T > & edgeWeights() const
Definition: EdgeWeightedGraphCopy.h:61
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::EdgeWeightedGraphCopy
Definition: EdgeWeightedGraphCopy.h:40
ogdf::EdgeElement::opposite
node opposite(node v) const
Returns the adjacent node different from v.
Definition: Graph_d.h:406
ogdf::EdgeElement
Class for the representation of edges.
Definition: Graph_d.h:356
ogdf::MinSteinerTreeTakahashi::computeSteinerTree
virtual T computeSteinerTree(const EdgeWeightedGraph< T > &G, const List< node > &terminals, const NodeArray< bool > &isTerminal, EdgeWeightedGraphCopy< T > *&finalSteinerTree) override
Computes the actual Steiner tree.
Definition: MinSteinerTreeTakahashi.h:105
List.h
Declaration of doubly linked lists and iterators.
ogdf::List::size
int size() const
Returns the number of elements in the list.
Definition: List.h:1478
ogdf::EdgeElement::target
node target() const
Returns the target node of the edge.
Definition: Graph_d.h:394
ogdf::MinSteinerTreeTakahashi::~MinSteinerTreeTakahashi
virtual ~MinSteinerTreeTakahashi()
Definition: MinSteinerTreeTakahashi.h:61
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233