68 template<
typename TYPE>
70 template<
typename TYPE>
207 const double gain = save.
gain(u, v, w);
276 T
best = std::numeric_limits<T>::max();
292 if (s != s0 &&
m_pred[s][center] !=
nullptr) {
309 if (s != s0 && s != s1 &&
m_pred[s][center] !=
nullptr) {
357 return gain / cost - 1.0;
404 != TripleGeneration::ondemand
405 || (winCalculation() == WinCalculation::absolute
406 && saveCalculation() != SaveCalculation::hybrid && pass() != Pass::one));
408 m_originalGraph = &G;
409 m_terminals = &terminals;
410 m_isTerminal = &isTerminal;
414 for (
node v : *m_terminals) {
418 if (terminals.
size() >= 3) {
419 computeDistanceMatrix();
427 switch (saveCalculation()) {
428 case SaveCalculation::staticEnum:
431 case SaveCalculation::staticLCATree:
434 case SaveCalculation::dynamicLCATree:
435 case SaveCalculation::hybrid:
441 if (tripleGeneration() == TripleGeneration::ondemand) {
445 if (saveCalculation() == SaveCalculation::hybrid) {
449 generateTriples(*save);
452 if (pass() == Pass::multi) {
470 if (m_ssspDistances) {
472 *m_isTerminal, m_distance, m_pred);
487 if (findBestTripleForCenter(center, save,
maxTriple)) {
488 ++m_triplesGenerated;
501 [](
const Triple<T>& x) ->
double {
return -x.
win(); }));
505 if (calcWin(
double(save.
gain(
t.s0(),
t.s1(),
t.s2())),
t.cost()) > 0) {
523 t.win(calcWin(
double(save.
gain(
t.s0(),
t.s1(),
t.s2())),
t.cost()));
528 if (tripleReduction() == TripleReduction::on &&
t.win() <= 0) {
Extends the GraphCopy concept to weighted graphs.
Definition of ogdf::steiner_tree::Full3ComponentGeneratorEnumeration class template.
Definition of ogdf::steiner_tree::Full3ComponentGeneratorVoronoi class template.
Declaration of doubly linked lists and iterators.
Declaration of ogdf::MinSteinerTreeModule.
A weighted tree as auxiliary data structure for contraction based algorithms.
Implementation of the staticTree option for calculating save edges in Zelikovsky's 11/6-approximation...
Implementation of the staticLCATree option for calculating save edges in Zelikovsky's 11/6-approximat...
Definition of a Triple used in contraction-based approximation algorithm for the minimum Steiner tree...
An array that keeps track of the number of inserted elements; also usable as an efficient stack.
Class for the representation of edges.
Doubly linked lists (maintaining the length of the list).
int size() const
Returns the number of elements in the list.
Encapsulates a pointer to a list element.
Serves as an interface for various methods to compute or approximate minimum Steiner trees on undirec...
virtual T call(const EdgeWeightedGraph< T > &G, const List< node > &terminals, const NodeArray< bool > &isTerminal, EdgeWeightedGraphCopy< T > *&finalSteinerTree)
Calls the Steiner tree algorithm for nontrivial cases but handles trivial cases directly.
static void allTerminalShortestPaths(const EdgeWeightedGraph< T > &G, const List< node > &terminals, const NodeArray< bool > &isTerminal, NodeArray< NodeArray< T > > &distance, NodeArray< NodeArray< edge > > &pred, std::function< void(const EdgeWeightedGraph< T > &, node, const NodeArray< bool > &, NodeArray< T > &, NodeArray< edge > &)> ssspFunc=singleSourceShortestPaths)
Runs a given (or the default) single-source-shortest-paths function from all terminals.
static void allPairShortestPaths(const EdgeWeightedGraph< T > &G, const NodeArray< bool > &isTerminal, NodeArray< NodeArray< T > > &distance, NodeArray< NodeArray< edge > > &pred)
The default all-pair-shortest-paths algorithm.
static void getNonterminals(ArrayBuffer< node > &nonterminals, const EdgeWeightedGraph< T > &G, const NodeArray< bool > &isTerminal)
Generates a list (as ArrayBuffer<node>) of all nonterminals.
This class implements the 11/6-approximation algorithm by Zelikovsky for the minimum Steiner tree pro...
bool findBestTripleForCenter(node center, const Save< T > &save, Triple< T > &maxTriple) const
Find the best triple for a given nonterminal center.
WinCalculation winCalculation() const
Returns type of gain calculation currently in use.
double calcWin(double gain, T cost) const
Calculate the win.
SaveCalculation
Different methods for obtaining save edges.
@ staticLCATree
Builds a "weight tree" (save edges are inner nodes, terminals are leaves and searches save edges via ...
@ dynamicLCATree
Same as staticLCATree but each time a triple has been contracted the "weight tree" is updated dynamic...
@ staticEnum
Stores explicitly the save edge for every pair of terminals. Needs O(n^2) space but has fast query ti...
@ hybrid
Uses staticEnum for the triple generation phase (many queries) and dynamicLCATree during the contract...
virtual ~MinSteinerTreeZelikovsky()
SaveCalculation saveCalculation() const
Returns type of save calculation currently in use.
Pass m_pass
Chosen option for pass.
TripleReduction tripleReduction() const
Returns type of triple reduction currently in use.
SaveCalculation m_saveCalculation
Chosen option for save calculation.
void forceAPSP(bool force=true)
For the 3-restricted case, it is sufficient to compute an SSSP from every terminal instead of doing a...
long m_triplesContracted
Number of contracted triples.
void tripleOnDemand(Save< T > &save, NodeArray< bool > &isNewTerminal)
Contraction phase for algorithm generating triples on demand.
virtual T computeSteinerTree(const EdgeWeightedGraph< T > &G, const List< node > &terminals, const NodeArray< bool > &isTerminal, EdgeWeightedGraphCopy< T > *&finalSteinerTree) override
Builds a minimum Steiner tree given a weighted graph and a list of terminals.
List< Triple< T > > m_triples
The list of triples during the algorithm.
void tripleGeneration(TripleGeneration tg)
Sets type of triple generation.
void onePass(Save< T > &save, NodeArray< bool > &isNewTerminal)
Contraction phase for the one pass heuristic.
TripleGeneration
Choice of triple generation.
@ voronoi
use voronoi regions
@ exhaustive
try all possibilities
@ ondemand
generate triples "on the fly", only usable with WinCalculation::absolute
TripleGeneration tripleGeneration() const
Returns type of triple generation currently in use.
const NodeArray< bool > * m_isTerminal
Incidence vector for terminal nodes.
const EdgeWeightedGraph< T > * m_originalGraph
The original edge-weighted graph.
Pass pass() const
Returns type of pass currently in use.
void tripleReduction(TripleReduction tr)
Sets type of triple reduction.
void generateTriples(const Save< T > &save, const steiner_tree::Full3ComponentGeneratorModule< T > &fcg)
Generates triples using the given full 3-component generator.
long numberOfGeneratedTriples() const
Returns the number of generated triples.
MinSteinerTreeZelikovsky(WinCalculation wc=WinCalculation::absolute, TripleGeneration tg=TripleGeneration::voronoi, SaveCalculation sc=SaveCalculation::hybrid, TripleReduction tr=TripleReduction::on, Pass pass=Pass::multi)
TripleReduction
Switches immediate triple dropping.
@ off
keeps triples all the time
@ on
removes triples as soon as their gain is known to be non positive
void generateInitialTerminalSpanningTree(EdgeWeightedGraphCopy< T > &steinerTree)
NodeArray< NodeArray< T > > m_distance
The distance matrix.
void computeDistanceMatrix()
Computes the distance matrix for the original graph.
TripleReduction m_tripleReduction
Chosen option for triple reduction.
void multiPass(Save< T > &save, NodeArray< bool > &isNewTerminal)
Contraction phase for the original version of the algorithm.
void saveCalculation(SaveCalculation sv)
Sets type of save calculation.
void generateTriples(const Save< T > &save)
Generates triples according to the chosen option.
long m_triplesGenerated
Number of generated triples.
NodeArray< NodeArray< edge > > m_pred
The predecessor matrix.
WinCalculation m_winCalculation
Chosen option for gain calculation.
bool m_ssspDistances
True iff we only compute SSSP from terminals instead of APSP for full component construction.
long m_tripleLookUps
Number of triple lookups.
TripleGeneration m_tripleGeneration
Chosen option for triple generation.
Pass
Enables a heuristic version (for TG exhaustive and voronoi only)
@ multi
normal, greedy version
@ one
heuristic: evaluate all triples, sort them descending by gain, traverse sorted triples once,...
long numberOfContractedTriples() const
Returns the number of contracted triples.
long numberOfTripleLookUps() const
Returns the number of triple lookups during execution time.
const List< node > * m_terminals
List of terminal nodes.
virtual T call(const EdgeWeightedGraph< T > &G, const List< node > &terminals, const NodeArray< bool > &isTerminal, EdgeWeightedGraphCopy< T > *&finalSteinerTree) override
Calls the Steiner tree algorithm for nontrivial cases but handles trivial cases directly.
void generateTriple(node u, node v, node w, node center, const T &minCost, const Save< T > &save)
Add a found triple to the triples list.
void pass(Pass p)
Sets type of pass.
void contractTriple(const Triple< T > &triple, Save< T > &save, NodeArray< bool > &isNewTerminal)
Contracts a triple and updates the save data structure.
void winCalculation(WinCalculation wc)
Sets type of gain calculation.
WinCalculation
Choice of objective function.
Dynamic arrays indexed with nodes.
Class for the representation of nodes.
node succ() const
Returns the successor in the list of all nodes.
Full 3-component generation using enumeration.
Interface for full 3-component generation including auxiliary functions.
Full 3-component generation using Voronoi regions.
Dynamically updatable weighted Tree for determining save edges via LCA computation.
This class computes save edges recursively and stores for every node pair their save edge in a HashAr...
This class serves as an interface for different approaches concerning the calculation of save edges.
virtual T gain(node u, node v, node w) const =0
Returns the gain (sum of the save edges) of a node triple.
virtual void update(const Triple< T > &t)=0
Updates the weighted tree data structure given a contracted triple.
virtual edge saveEdge(node u, node v) const =0
Returns the save edge between two nodes.
virtual T saveWeight(node u, node v) const =0
Returns the weight of the save edge between two nodes.
This class behaves basically the same as SaveDynamic except that the update of the weighted graph is ...
This class represents a triple used by various contraction-based minimum Steiner tree approximations.
Algorithms used by at least two functions of Steiner tree code or its internal helpers.
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.
static MultilevelBuilder * getDoubleFactoredZeroAdjustedMerger()
T obtainFinalSteinerTree(const EdgeWeightedGraph< T > &G, const NodeArray< bool > &isTerminal, const NodeArray< bool > &isOriginalTerminal, EdgeWeightedGraphCopy< T > *&finalSteinerTree)
The namespace for all OGDF objects.
Compare elements based on a single comparable attribute.