Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

Loading...
Searching...
No Matches
MinSteinerTreeTakahashi.h
Go to the documentation of this file.
1
33#pragma once
34
35#include <ogdf/basic/Graph.h>
37#include <ogdf/basic/List.h>
39#include <ogdf/basic/basic.h>
44
45#include <limits>
46
47namespace ogdf {
48template<typename T>
49class EdgeWeightedGraph;
50
65template<typename T>
67public:
69
71
79 virtual T call(const EdgeWeightedGraph<T>& G, const List<node>& terminals,
80 const NodeArray<bool>& isTerminal, EdgeWeightedGraphCopy<T>*& finalSteinerTree,
81 const node startNode) {
82 return call(G, terminals, isTerminal, isTerminal, finalSteinerTree, startNode);
83 }
84
92 virtual T call(const EdgeWeightedGraph<T>& G, const List<node>& terminals,
93 const NodeArray<bool>& isTerminal, const NodeArray<bool>& isOriginalTerminal,
94 EdgeWeightedGraphCopy<T>*& finalSteinerTree) {
95 return call(G, terminals, isTerminal, isOriginalTerminal, finalSteinerTree,
96 terminals.front());
97 }
98
100
109 virtual T call(const EdgeWeightedGraph<T>& G, const List<node>& terminals,
110 const NodeArray<bool>& isTerminal, const NodeArray<bool>& isOriginalTerminal,
111 EdgeWeightedGraphCopy<T>*& finalSteinerTree, const node startNode);
112
113protected:
114 virtual T computeSteinerTree(const EdgeWeightedGraph<T>& G, const List<node>& terminals,
115 const NodeArray<bool>& isTerminal, EdgeWeightedGraphCopy<T>*& finalSteinerTree) override {
116 return call(G, terminals, isTerminal, isTerminal, finalSteinerTree, terminals.front());
117 }
118
129 EdgeWeightedGraphCopy<T>& intermediateTerminalSpanningTree, const node s,
130 int numberOfTerminals, const NodeArray<bool>& isTerminal);
131};
132
133template<typename T>
135 const NodeArray<bool>& isTerminal, const NodeArray<bool>& isOriginalTerminal,
136 EdgeWeightedGraphCopy<T>*& finalSteinerTree, const node startNode) {
138
139 EdgeWeightedGraphCopy<T> terminalSpanningTree;
140 terminalSpanningTree.setOriginalGraph(G);
141 terminalDijkstra(G, terminalSpanningTree, startNode, terminals.size(), isTerminal);
142
143 finalSteinerTree = new EdgeWeightedGraphCopy<T>(G);
144 for (node u : G.nodes) {
145 if (!terminalSpanningTree.copy(u)) {
146 finalSteinerTree->delNode(finalSteinerTree->copy(u));
147 }
148 }
149
150 T mstWeight = makeMinimumSpanningTree(*finalSteinerTree, finalSteinerTree->edgeWeights());
151 mstWeight -= MinSteinerTreeModule<T>::pruneAllDanglingSteinerPaths(*finalSteinerTree,
152 isOriginalTerminal);
153
154 return mstWeight;
155}
156
157template<typename T>
159 EdgeWeightedGraphCopy<T>& intermediateTerminalSpanningTree, const node s,
160 int numberOfTerminals, const NodeArray<bool>& isTerminal) {
161 NodeArray<edge> predecessor(wG, nullptr);
162 NodeArray<T> distance(wG, std::numeric_limits<T>::max());
163 distance[s] = 0;
164 NodeArray<T> bestDistance(wG, std::numeric_limits<T>::max());
165 bestDistance[s] = 0;
166 NodeArray<bool> isInQueue(wG, true);
167
168 PrioritizedMapQueue<node, T> queue(wG); //priority queue
169 for (node v : wG.nodes) {
170 queue.push(v, distance[v]);
171 }
172
173 T mstWeight = 0;
174 int terminalsFound = 1;
175 while (!queue.empty() && terminalsFound < numberOfTerminals) {
176 node v = queue.topElement();
177 queue.pop();
178 isInQueue[v] = false;
179 bestDistance[v] = distance[v];
180 if (isTerminal[v] && distance[v] > 0) {
181 ++terminalsFound;
182 // insert path from new node to old tree
183 node tmpT = intermediateTerminalSpanningTree.newNode(v);
184 while (distance[v] > 0) {
185 distance[v] = 0;
186 queue.push(v, distance[v]);
187 isInQueue[v] = true;
188 const edge e = predecessor[v];
189 OGDF_ASSERT(e);
190 const node w = e->opposite(v);
191 node tmpS = intermediateTerminalSpanningTree.copy(w);
192 if (!tmpS) {
193 tmpS = intermediateTerminalSpanningTree.newNode(w);
194 }
195 edge tmpE;
196 if (e->target() == v) {
197 tmpE = intermediateTerminalSpanningTree.newEdge(tmpS, tmpT, wG.weight(e));
198 } else {
199 tmpE = intermediateTerminalSpanningTree.newEdge(tmpT, tmpS, wG.weight(e));
200 }
201 mstWeight += wG.weight(e);
202 intermediateTerminalSpanningTree.setEdge(e, tmpE);
203 tmpT = tmpS;
204 v = w;
205 }
206 } else { // !isTerminal[v] || distance[v] == 0
207 for (adjEntry adj : v->adjEntries) {
208 const node w = adj->twinNode();
209 const edge e = adj->theEdge();
210 if (distance[w] > distance[v] + wG.weight(e) && bestDistance[w] >= distance[w]) {
211 distance[w] = distance[v] + wG.weight(e);
212 if (!isInQueue[w]) {
213 queue.push(w, distance[w]);
214 isInQueue[w] = true;
215 } else {
216 queue.decrease(w, distance[w]);
217 }
218 predecessor[w] = e;
219 }
220 }
221 }
222 }
223 return mstWeight;
224}
225
226}
Extends the GraphCopy concept to weighted graphs.
Includes declaration of graph class.
Decralation of GraphElement and GraphList classes.
Declaration of doubly linked lists and iterators.
Declaration of ogdf::MinSteinerTreeModule.
Priority queue interface wrapping various heaps.
Basic declarations, included by all source files.
Class for adjacency list elements.
Definition Graph_d.h:143
Class for the representation of edges.
Definition Graph_d.h:364
node opposite(node v) const
Returns the adjacent node different from v.
Definition Graph_d.h:414
node target() const
Returns the target node of the edge.
Definition Graph_d.h:402
edge newEdge(node u, node v, T weight)
void setOriginalGraph(const Graph *wG) override
Re-initializes the copy using G (which might be null), but does not create any nodes or edges.
const EdgeArray< T > & edgeWeights() const
T weight(const edge e) const
node newNode(node vOrig)
Creates a new node in the graph copy with original node vOrig.
Definition GraphCopy.h:191
void delNode(node v) override
Removes node v.
Definition GraphCopy.h:206
edge copy(edge e) const override
Returns the first edge in the list of edges corresponding to edge e.
Definition GraphCopy.h:463
void setEdge(edge eOrig, edge eCopy)
sets eOrig to be the corresponding original edge of eCopy and vice versa
internal::GraphObjectContainer< NodeElement > nodes
The container containing all node objects.
Definition Graph_d.h:929
Doubly linked lists (maintaining the length of the list).
Definition List.h:1451
int size() const
Returns the number of elements in the list.
Definition List.h:1488
const_reference front() const
Returns a const reference to the first element.
Definition List.h:305
Serves as an interface for various methods to compute or approximate minimum Steiner trees on undirec...
static T pruneAllDanglingSteinerPaths(EdgeWeightedGraphCopy< T > &steinerTree, const NodeArray< bool > &isTerminal)
Prunes nonterminal leaves and their paths to terminal or branching nodes.
This class implements the minimum Steiner tree 2-approximation algorithm by Takahashi and Matsuyama w...
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.
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.
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.
virtual T computeSteinerTree(const EdgeWeightedGraph< T > &G, const List< node > &terminals, const NodeArray< bool > &isTerminal, EdgeWeightedGraphCopy< T > *&finalSteinerTree) override
Computes the actual Steiner tree.
Class for the representation of nodes.
Definition Graph_d.h:241
internal::GraphObjectContainer< AdjElement > adjEntries
The container containing all entries in the adjacency list of this node.
Definition Graph_d.h:272
Prioritized queue interface wrapper for heaps.
bool empty() const
Checks whether the queue is empty.
RegisteredArray for nodes, edges and adjEntries of a graph.
Definition Graph_d.h:659
void decrease(const E &element, const P &priority)
Decreases the priority of the given element.
void pop()
Removes the topmost element from the queue.
void push(const E &element, const P &priority)
Adds a new element to the queue.
const E & topElement() const
Returns the topmost element in the queue.
Declaration of extended graph algorithms.
bool isConnected(const Graph &G)
Returns true iff G is connected.
T makeMinimumSpanningTree(Graph &G, const EdgeArray< T > &weight)
Reduce a graph to its minimum spanning tree (MST) using Kruskal's algorithm.
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition basic.h:52
The namespace for all OGDF objects.
Declaration of simple graph algorithms.