z3-z3-4.12.6.src.util.min_cut.h Maven / Gradle / Ivy
/*++
Copyright (c) 2017 Arie Gurfinkel
Module Name:
min_cut.h
Abstract:
min cut solver
Author:
Bernhard Gleiss
Revision History:
--*/
#pragma once
#include "util/vector.h"
class min_cut {
public:
min_cut();
/*
\brief create a node
*/
unsigned new_node();
/*
\brief add an i -> j edge with (unit) capacity
*/
void add_edge(unsigned i, unsigned j, unsigned capacity = 1);
/*
\brief produce a min cut between source node = 0 and target node = 1.
NB. the function changes capacities on edges.
*/
void compute_min_cut(unsigned_vector& cut_nodes);
private:
struct edge { unsigned node; unsigned weight; edge(unsigned n, unsigned w): node(n), weight(w) {} edge(): node(0), weight(0) {} };
typedef svector edge_vector;
vector m_edges; // map from node to all outgoing edges together with their weights (also contains "reverse edges")
unsigned_vector m_d; // approximation of distance from node to sink in residual graph
unsigned_vector m_pred; // predecessor-information for reconstruction of augmenting path
void compute_initial_distances();
unsigned get_admissible_edge(unsigned i);
void augment_path();
void compute_distance(unsigned i);
void compute_reachable_nodes(bool_vector& reachable);
void compute_cut_and_add_lemmas(bool_vector& reachable, unsigned_vector& cut_nodes);
};