Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

MinSTCutDijkstra.h
Go to the documentation of this file.
1 
32 #pragma once
33 
35 #include <ogdf/basic/DualGraph.h>
36 #include <ogdf/basic/Graph.h>
37 #include <ogdf/basic/GraphCopy.h>
38 #include <ogdf/basic/List.h>
39 #include <ogdf/basic/basic.h>
40 #include <ogdf/graphalg/Dijkstra.h>
42 
43 namespace ogdf {
44 
54 template<typename TCost>
55 class MinSTCutDijkstra : public MinSTCutModule<TCost> {
56 public:
58 
62  virtual bool call(const Graph& graph, const EdgeArray<TCost>& weight, node s, node t,
63  List<edge>& edgeList, edge e_st = nullptr) override;
64 
68  virtual bool call(const Graph& graph, node s, node t, List<edge>& edgeList,
69  edge e_st = nullptr) override {
70  EdgeArray<TCost> weight(graph, 1);
71  return call(graph, weight, s, t, edgeList, e_st);
72  }
73 
75 };
76 
77 template<typename TCost>
78 bool MinSTCutDijkstra<TCost>::call(const Graph& graph, const EdgeArray<TCost>& weight, node s,
79  node t, List<edge>& edgeList, edge e_st) {
80  delete m_gc;
81  m_gc = new GraphCopy(graph);
83 
84  MinSTCutModule<TCost>::preprocessingDual(graph, *m_gc, CE, s, t, e_st);
85 
87 
88  DualGraph dual(CE);
89  if (e_st != nullptr) {
90  e_st = m_gc->copy(e_st);
91  } else {
92  e_st = m_gc->searchEdge(m_gc->copy(s), m_gc->copy(t));
93  }
94  edgeList.clear();
95  node source = dual.dualNode(CE.rightFace(e_st->adjSource()));
96  node target = dual.dualNode(CE.leftFace(e_st->adjSource()));
97 
98 
99  EdgeArray<TCost> weightDual(dual, 0);
100  TCost sumOfWeights(0);
101  for (edge e : m_gc->edges) {
102  if (e != e_st) {
103  weightDual[dual.dualEdge(e)] = weight[m_gc->original(e)];
104  sumOfWeights += weightDual[dual.dualEdge(e)];
105  OGDF_ASSERT(sumOfWeights > sumOfWeights - weightDual[dual.dualEdge(e)]);
106  }
107  }
108  weightDual[dual.dualEdge(e_st)] = sumOfWeights + 1;
109  List<node> sourceNodeList;
110  sourceNodeList.pushFront(source);
111  NodeArray<edge> prevEdge(dual);
112  NodeArray<TCost> distance(dual);
113  Dijkstra<TCost> D;
114  D.call(dual, weightDual, sourceNodeList, prevEdge, distance);
115 
116  node v = target;
117  do {
118  edge eDual = prevEdge[v];
119  OGDF_ASSERT(eDual != nullptr);
120  edge eG = dual.primalEdge(eDual);
121  OGDF_ASSERT(eG != nullptr);
122  edgeList.pushBack(m_gc->original(eG));
123  MinSTCutModule<TCost>::m_direction[m_gc->original(eG)] = eDual->target() != v;
124  v = (v == eDual->target() ? eDual->source() : eDual->target());
125  } while (v != source);
126  return true;
127 }
128 }
ogdf
The namespace for all OGDF objects.
Definition: multilevelmixer.cpp:39
Graph.h
Includes declaration of graph class.
OGDF_ASSERT
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition: basic.h:66
ogdf::DualGraphBase
A dual graph including its combinatorial embedding of an embedded graph.
Definition: DualGraph.h:47
ogdf::MinSTCutModule::preprocessingDual
bool preprocessingDual(const Graph &graph, GraphCopy &gc, CombinatorialEmbedding &CE, node source, node target, edge e_st)
This method preprocesses gc for minstcut calculations, by adding an st-edge if needed and embedding g...
Definition: MinSTCutModule.h:113
ogdf::ConstCombinatorialEmbedding::leftFace
face leftFace(adjEntry adj) const
Returns the face to the left of adj, i.e., the face containing the twin of adj.
Definition: CombinatorialEmbedding.h:285
ogdf::ConstCombinatorialEmbedding::rightFace
face rightFace(adjEntry adj) const
Returns the face to the right of adj, i.e., the face containing adj.
Definition: CombinatorialEmbedding.h:279
ogdf::GraphCopy
Copies of graphs supporting edge splitting.
Definition: GraphCopy.h:391
ogdf::MinSTCutDijkstra::call
virtual bool call(const Graph &graph, const EdgeArray< TCost > &weight, node s, node t, List< edge > &edgeList, edge e_st=nullptr) override
The actual algorithm call.
Definition: MinSTCutDijkstra.h:78
ogdf::Dijkstra
Dijkstra's single source shortest path algorithm.
Definition: Dijkstra.h:60
ogdf::List::pushFront
iterator pushFront(const E &x)
Adds element x at the beginning of the list.
Definition: List.h:1534
ogdf::MinSTCutModule
Definition: MinSTCutModule.h:45
ogdf::Dijkstra::call
void call(const Graph &G, const EdgeArray< T > &weight, const List< node > &sources, NodeArray< edge > &predecessor, NodeArray< T > &distance, bool directed=false, bool arcsReversed=false, node target=nullptr, T maxLength=std::numeric_limits< T >::max())
Calculates, based on the graph G with corresponding edge costs and source nodes, the shortest paths a...
Definition: Dijkstra.h:253
DualGraph.h
Includes declaration of dual graph class.
ogdf::EdgeElement::source
node source() const
Returns the source node of the edge.
Definition: Graph_d.h:398
GraphCopy.h
Declaration of graph copy classes.
ogdf::List< edge >
ogdf::internal::GraphRegisteredArray
RegisteredArray for nodes, edges and adjEntries of a graph.
Definition: Graph_d.h:658
ogdf::EdgeElement::adjSource
adjEntry adjSource() const
Returns the corresponding adjacancy entry at source node.
Definition: Graph_d.h:407
ogdf::Graph
Data type for general directed graphs (adjacency list representation).
Definition: Graph_d.h:869
ogdf::MinSTCutDijkstra::MinSTCutDijkstra
MinSTCutDijkstra()
Definition: MinSTCutDijkstra.h:57
ogdf::MinSTCutDijkstra
Min-st-cut algorithm, that calculates the cut by calculating the shortest path between the faces adja...
Definition: MinSTCutDijkstra.h:55
ogdf::DualGraphBase::dualEdge
const edge & dualEdge(edge e) const
Returns the edge in the dual graph corresponding to e.
Definition: DualGraph.h:182
basic.h
Basic declarations, included by all source files.
CombinatorialEmbedding.h
Declaration of CombinatorialEmbedding and face.
ogdf::DualGraphBase::primalEdge
const edge & primalEdge(edge e) const
Returns the edge in the primal graph corresponding to e.
Definition: DualGraph.h:161
ogdf::CombinatorialEmbedding
Combinatorial embeddings of planar graphs with modification functionality.
Definition: CombinatorialEmbedding.h:406
ogdf::EdgeElement
Class for the representation of edges.
Definition: Graph_d.h:363
Dijkstra.h
Implementation of Dijkstra's single source shortest path algorithm.
List.h
Declaration of doubly linked lists and iterators.
ogdf::EdgeElement::target
node target() const
Returns the target node of the edge.
Definition: Graph_d.h:401
ogdf::DualGraphBase::dualNode
const node & dualNode(face f) const
Returns the node in the dual graph corresponding to f.
Definition: DualGraph.h:175
MinSTCutModule.h
Template of base class of min-st-cut algorithms.
ogdf::NodeElement
Class for the representation of nodes.
Definition: Graph_d.h:240
ogdf::MinSTCutDijkstra::call
virtual bool call(const Graph &graph, node s, node t, List< edge > &edgeList, edge e_st=nullptr) override
The actual algorithm call.
Definition: MinSTCutDijkstra.h:68
ogdf::List::pushBack
iterator pushBack(const E &x)
Adds element x at the end of the list.
Definition: List.h:1547
ogdf::internal::EdgeArrayBase2
RegisteredArray for edges of a graph, specialized for EdgeArray<edge>.
Definition: Graph_d.h:716
ogdf::List::clear
void clear()
Removes all elements from the list.
Definition: List.h:1626