All Downloads are FREE. Search and download functionalities are using the official Maven repository.

z3-z3-4.13.0.src.util.min_cut.h Maven / Gradle / Ivy

The newest version!
/*++
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);
};





© 2015 - 2024 Weber Informatics LLC | Privacy Policy