49class EdgeWeightedGraph;
81 const node startNode) {
82 return call(G, terminals, isTerminal, isTerminal, finalSteinerTree, startNode);
95 return call(G, terminals, isTerminal, isOriginalTerminal, finalSteinerTree,
116 return call(G, terminals, isTerminal, isTerminal, finalSteinerTree, terminals.
front());
141 terminalDijkstra(G, terminalSpanningTree, startNode, terminals.
size(), isTerminal);
144 for (
node u : G.nodes) {
145 if (!terminalSpanningTree.
copy(u)) {
146 finalSteinerTree->
delNode(finalSteinerTree->
copy(u));
162 NodeArray<T> distance(wG, std::numeric_limits<T>::max());
164 NodeArray<T> bestDistance(wG, std::numeric_limits<T>::max());
170 queue.
push(v, distance[v]);
174 int terminalsFound = 1;
175 while (!queue.
empty() && terminalsFound < numberOfTerminals) {
178 isInQueue[v] =
false;
179 bestDistance[v] = distance[v];
180 if (isTerminal[v] && distance[v] > 0) {
183 node tmpT = intermediateTerminalSpanningTree.
newNode(v);
184 while (distance[v] > 0) {
186 queue.
push(v, distance[v]);
188 const edge e = predecessor[v];
191 node tmpS = intermediateTerminalSpanningTree.
copy(w);
193 tmpS = intermediateTerminalSpanningTree.
newNode(w);
197 tmpE = intermediateTerminalSpanningTree.
newEdge(tmpS, tmpT, wG.
weight(e));
199 tmpE = intermediateTerminalSpanningTree.
newEdge(tmpT, tmpS, wG.
weight(e));
201 mstWeight += wG.
weight(e);
202 intermediateTerminalSpanningTree.
setEdge(e, tmpE);
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);
213 queue.
push(w, distance[w]);
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.
Class for the representation of edges.
node opposite(node v) const
Returns the adjacent node different from v.
node target() const
Returns the target node of the edge.
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.
void delNode(node v) override
Removes node v.
edge copy(edge e) const override
Returns the first edge in the list of edges corresponding to edge e.
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.
Doubly linked lists (maintaining the length of the list).
int size() const
Returns the number of elements in the list.
const_reference front() const
Returns a const reference to the first element.
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...
MinSteinerTreeTakahashi()
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.
virtual ~MinSteinerTreeTakahashi()
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.
internal::GraphObjectContainer< AdjElement > adjEntries
The container containing all entries in the adjacency list of this node.
Prioritized queue interface wrapper for heaps.
bool empty() const
Checks whether the queue is empty.
RegisteredArray for nodes, edges and adjEntries of a graph.
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.
The namespace for all OGDF objects.
Declaration of simple graph algorithms.