59template<
typename TCost>
81 bool primaryCut =
true,
bool calculateOtherCut =
true,
87 ,
m_et(epsilonTest) { }
99 edge e_st =
nullptr)
override {
101 return call(graph, weight, s, t, edgeList, e_st);
114 const node source,
const node target);
207 std::unique_ptr<EpsilonTest>
m_et;
228 while (!queue.
empty()) {
231 const node w = adj->twinNode();
232 const edge e = adj->theEdge();
269 markCut(source,
true, origNode);
274 markCut(target,
false, origNode);
281 if (startAdj ==
nullptr) {
288 adj != startAdj; adj = (
m_primaryCut ? adj->cyclicSucc() : adj->cyclicPred())) {
289 if (adj->theEdge()->adjTarget() != adj) {
290 stack.
push(adj->theEdge());
293 while (!stack.
empty()) {
295 if (visited[origEdge(e)]) {
298 visited[origEdge(e)] =
true;
310 adj = (
m_primaryCut ? adj->cyclicSucc() : adj->cyclicPred())) {
311 if (adj->theEdge()->adjTarget() != adj) {
312 stack.
push(adj->theEdge());
320template<
typename TCost>
327 if (e_st !=
nullptr) {
328 m_gc->delEdge(m_gc->copy(e_st));
330 node s = m_gc->copy(source);
331 node t = m_gc->copy(target);
333 m_gc->allEdges(edges);
335 for (
edge e : edges) {
336 if (m_treatAsUndirected) {
338 edge revEdge = m_gc->newEdge(e->target(), e->source());
341 originalEdge[revEdge] = m_gc->original(e);
343 originalEdge[e] = m_gc->original(e);
346 m_flow.
init(*m_gc, -1);
347 m_weight.
init(*m_gc, 1);
348 for (
edge e : m_gc->edges) {
349 edge origEdge = originalEdge[e];
350 m_weight[e] = weight[origEdge];
354 m_mfModule->init(*m_gc);
355 m_mfModule->computeFlow(m_weight, s, t, m_flow);
358 graph, [&](
edge e) ->
edge {
return originalEdge[e]; },
359 [&](
node v) ->
node {
return m_gc->original(v); }, s, t, edgeList);
364template<
typename TCost>
373 graph, [&](
edge e) ->
edge {
return e; }, [&](
node v) ->
node {
return v; }, source,
Declaration and implementation of ArrayBuffer class.
Compare floating point numbers with epsilons and integral numbers with normal compare operators.
Includes declaration of graph class.
Declaration of graph copy classes.
Decralation of GraphElement and GraphList classes.
Declaration of doubly linked lists and iterators.
Declaration and implementation of Goldberg-Tarjan max-flow algorithm with global relabeling and gap r...
Template of base class of min-st-cut algorithms.
Basic declarations, included by all source files.
Class for adjacency list elements.
adjEntry cyclicSucc() const
Returns the cyclic successor in the adjacency list.
edge theEdge() const
Returns the edge associated with this adjacency entry.
adjEntry cyclicPred() const
Returns the cyclic predecessor in the adjacency list.
An array that keeps track of the number of inserted elements; also usable as an efficient stack.
E popRet()
Removes the newest element from the buffer and returns it.
void push(E e)
Puts a new element in the buffer.
bool empty() const
Returns true if the buffer is empty, false otherwise.
Class for the representation of edges.
adjEntry adjTarget() const
Returns the corresponding adjacancy entry at target node.
node target() const
Returns the target node of the edge.
node source() const
Returns the source node of the edge.
Copies of graphs supporting edge splitting.
edge copy(edge e) const override
Returns the first edge in the list of edges corresponding to edge e.
Data type for general directed graphs (adjacency list representation).
int numberOfNodes() const
Returns the number of nodes in the graph.
int numberOfEdges() const
Returns the number of edges in the graph.
Doubly linked lists (maintaining the length of the list).
iterator pushBack(const E &x)
Adds element x at the end of the list.
E popFrontRet()
Removes the first element from the list and returns it.
bool empty() const
Returns true iff the list is empty.
Computes a max flow via Preflow-Push (global relabeling and gap relabeling heuristic).
Min-st-cut algorithm, that calculates the cut via maxflow.
void markCut(node startNode, bool frontCut, std::function< node(node)> origNode)
Mark the all nodes which are in the same cut partition as the startNode.
std::unique_ptr< MaxFlowModule< TCost > > m_mfModule
the module used for calculating the maxflow
bool isBackCutEdge(const edge e) const
Returns whether this edge is entering the back cut.
bool isInBackCut(const node v) const
Returns whether this node is part of the back cut.
EdgeArray< TCost > m_flow
std::unique_ptr< EpsilonTest > m_et
virtual bool call(const Graph &graph, node s, node t, List< edge > &edgeList, edge e_st=nullptr) override
The actual algorithm call.
cutType
The three types of cuts.
@ NO_CUT
node is not part of any cut
@ BACK_CUT
node is in back cut
@ FRONT_CUT
node is in front cut
EdgeArray< TCost > m_weight
bool isFrontCutEdge(const edge e) const
Returns whether this edge is leaving the front cut.
bool isOfType(const node v, cutType type) const
Return whether this node is of the specified type.
MinSTCutMaxFlow(bool treatAsUndirected=true, MaxFlowModule< TCost > *mfModule=new MaxFlowGoldbergTarjan< TCost >(), bool primaryCut=true, bool calculateOtherCut=true, EpsilonTest *epsilonTest=new EpsilonTest())
Constructor.
NodeArray< cutType > m_nodeSet
void computeCut(const Graph &graph, std::function< edge(edge)> origEdge, std::function< node(node)> origNode, const node source, const node target, List< edge > &edgeList)
Partitions the nodes to front and back cut.
void setEpsilonTest(EpsilonTest *et)
Assigns a new epsilon test.
bool m_treatAsUndirected
states whether or not edges are considered undirected while calculating the maxflow
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.
bool frontCutIsComplementOfBackCut() const
Returns whether the front cut is the complement of the backcut.
bool m_calculateOtherCut
iff true, the other (near to s for primaryCut == false, near to t for primaryCut == true) cut should ...
bool m_primaryCut
true if the algorithm should search for the mincut nearest to s, false if it should be near to t.
bool isInFrontCut(const node v) const
Returns whether this node is part of the front cut.
Class for the representation of nodes.
internal::GraphObjectContainer< AdjElement > adjEntries
The container containing all entries in the adjacency list of this node.
adjEntry firstAdj() const
Returns the first entry in the adjaceny list.
void init(const Base *base=nullptr)
Reinitializes the array. Associates the array with the matching registry of base.
RegisteredArray for edges of a graph, specialized for EdgeArray<edge>.
RegisteredArray for nodes, edges and adjEntries of a graph.
NodeElement * node
The type of nodes.
EdgeElement * edge
The type of edges.
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
The namespace for all OGDF objects.