Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

CoreEdgeRandomSpanningTree.h
Go to the documentation of this file.
1 
32 #pragma once
33 
35 #include <ogdf/basic/NodeArray.h>
37 
38 namespace ogdf {
39 namespace steiner_tree {
40 namespace goemans {
41 
43 template<typename T>
45  std::minstd_rand& m_rng;
46 
47 public:
48  CoreEdgeRandomSpanningTree(std::minstd_rand& rng) : m_rng(rng) { }
49 
50  void call(const Graph& graph, const List<node>& terminals,
51  EdgeArray<bool>& isInTree) const override {
52  // Let's do Kruskal's algorithm without weights but on a randomly permuted edge list.
53  // We virtually contract all terminals in the union-find data structure.
54  NodeArray<int> setID(graph, -1);
55  isInTree.init(graph, false);
56  DisjointSets<> uf(graph.numberOfNodes() - terminals.size() + 1);
57 
58  int contractedID = uf.makeSet();
59  OGDF_ASSERT(contractedID >= 0);
60  for (node t : terminals) {
61  setID[t] = contractedID;
62  }
63  for (node v : graph.nodes) {
64  if (setID[v] < 0) {
65  setID[v] = uf.makeSet();
66  }
67  }
68 
69  // obtain a random edge permutation
70  ArrayBuffer<edge> edgePermutation;
71  for (edge e : graph.edges) {
72  edgePermutation.push(e);
73  }
74  edgePermutation.permute(m_rng);
75 
76  // add edges if we do not close a cycle
77  for (edge e : edgePermutation) {
78  const int v = setID[e->source()];
79  const int w = setID[e->target()];
80  if (uf.find(v) != uf.find(w)) {
81  isInTree[e] = true;
82  uf.link(uf.find(v), uf.find(w));
83  }
84  }
85  }
86 };
87 
88 }
89 }
90 }
ogdf::ArrayBuffer< edge >
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::DisjointSets::find
int find(disjoint_sets::CompressionOption< CompressionOptions::PathCompression >, int set)
Definition: DisjointSets.h:332
ogdf::steiner_tree::goemans::CoreEdgeRandomSpanningTree::m_rng
std::minstd_rand & m_rng
Definition: CoreEdgeRandomSpanningTree.h:45
ogdf::DisjointSets::makeSet
int makeSet()
Initializes a singleton set.
Definition: DisjointSets.h:235
ogdf::DisjointSets::link
int link(disjoint_sets::LinkOption< LinkOptions::Naive >, int set1, int set2)
Definition: DisjointSets.h:624
ogdf::Graph::nodes
internal::GraphObjectContainer< NodeElement > nodes
The container containing all node objects.
Definition: Graph_d.h:924
ogdf::Graph::numberOfNodes
int numberOfNodes() const
Returns the number of nodes in the graph.
Definition: Graph_d.h:974
ogdf::DisjointSets
A Union/Find data structure for maintaining disjoint sets.
Definition: DisjointSets.h:90
CoreEdgeModule.h
Definition of ogdf::steiner_tree::goemans::CoreEdgeModule class template.
ogdf::ArrayBuffer::push
void push(E e)
Puts a new element in the buffer.
Definition: ArrayBuffer.h:209
ogdf::EdgeElement::source
node source() const
Returns the source node of the edge.
Definition: Graph_d.h:391
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::Graph
Data type for general directed graphs (adjacency list representation).
Definition: Graph_d.h:862
NodeArray.h
Declaration and implementation of NodeArray class.
ogdf::ArrayBuffer::permute
void permute(INDEX l, INDEX r, RNG &rng)
Randomly permutes the subarray with index set [l..r] using random number generator rng.
Definition: ArrayBuffer.h:467
ogdf::Graph::edges
internal::GraphObjectContainer< EdgeElement > edges
The container containing all edge objects.
Definition: Graph_d.h:927
ogdf::steiner_tree::goemans::CoreEdgeModule
Interface for core edge finder algorithms.
Definition: CoreEdgeModule.h:42
DisjointSets.h
Implementation of disjoint sets data structures (union-find functionality).
ogdf::EdgeElement
Class for the representation of edges.
Definition: Graph_d.h:356
ogdf::steiner_tree::goemans::CoreEdgeRandomSpanningTree
Computes a random set of core edges.
Definition: CoreEdgeRandomSpanningTree.h:44
ogdf::RegisteredArray< GraphRegistry< EdgeElement >, Value, WithDefault, Graph >::init
void init(const Graph *base=nullptr)
Reinitializes the array. Associates the array with the matching registry of base.
Definition: RegisteredArray.h:849
ogdf::List::size
int size() const
Returns the number of elements in the list.
Definition: List.h:1478
ogdf::steiner_tree::goemans::CoreEdgeRandomSpanningTree::CoreEdgeRandomSpanningTree
CoreEdgeRandomSpanningTree(std::minstd_rand &rng)
Definition: CoreEdgeRandomSpanningTree.h:48
ogdf::EdgeElement::target
node target() const
Returns the target node of the edge.
Definition: Graph_d.h:394
ogdf::steiner_tree::goemans::CoreEdgeRandomSpanningTree::call
void call(const Graph &graph, const List< node > &terminals, EdgeArray< bool > &isInTree) const override
Compute a set of core edges.
Definition: CoreEdgeRandomSpanningTree.h:50
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:233
ogdf::internal::EdgeArrayBase2
RegisteredArray for edges of a graph, specialized for EdgeArray<edge>.
Definition: Graph_d.h:709