#include <iostream> //std::cin,cout,ios_base
#include <vector> //std::vector
#include <tuple> //std::tie
#include <limits.h> //INT_MAX (no `std::')
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/push_relabel_max_flow.hpp>
using namespace boost;
struct VertexProperties{
};
struct EdgeProperties{
int id;
int capacity;
int residual_capacity;
};
typedef boost::adjacency_list<vecS,vecS,directedS,VertexProperties,EdgeProperties> Graph;
typedef boost::graph_traits<Graph> Traits;
typedef Traits::vertex_descriptor Vertex;
typedef Traits::edge_descriptor Edge;
void do_add_edge(int& next_id, const Vertex& a, const Vertex& b, const int c, Graph& g,std::map<Edge,Edge>& reverse_edge_of);
int main(int arc, char* argv[]){
std::ios_base::sync_with_stdio(false);
int n = 3; //nof vertices ( >2)
Graph g(n);
Vertex s = vertex(n-2,g); //source
Vertex t = vertex(n-1,g); //sink
Vertex u = vertex(0,g);
std::map<Edge,Edge> reverse_edge_map;
int next_id = 0;
do_add_edge(next_id,s,u,3,g,reverse_edge_map);
do_add_edge(next_id,u,t,1,g,reverse_edge_map);
std::vector<int> rescap(num_edges(g));
//why doesn't this work?
/*int maxflow = push_relabel_max_flow(
g,
s,
t,
capacity_map(get(&EdgeProperties::capacity,g))
.residual_capacity_map(get(&EdgeProperties::residual_capacity,g))
.reverse_edge_map(make_assoc_property_map(reverse_edge_map))
.vertex_index_map(get(vertex_index,g))
);*/
//this does work
int maxflow = push_relabel_max_flow(
g,
s,
t,
get(&EdgeProperties::capacity,g),
get(&EdgeProperties::residual_capacity,g),
make_assoc_property_map(reverse_edge_map),
get(vertex_index,g)
);
std::cout << "maxflow = " << maxflow << "\n";
return 0;
}
void do_add_edge(int& next_id, const Vertex& a, const Vertex& b, const int c, Graph& g,std::map<Edge,Edge>& reverse_edge_of){
Edge e,re; bool success;
std::tie(e,success) = add_edge(a,b,g);
g[e].id = next_id;
g[e].capacity = c;
g[e].residual_capacity = c;
//reverse edge
std::tie(re,success) = add_edge(b,a,g);
g[re].id = next_id + 1;
g[re].capacity = 0;
g[re].residual_capacity = 0;
reverse_edge_of[e] = re;
reverse_edge_of[re] = e;
next_id += 2;
}
I2luY2x1ZGUgPGlvc3RyZWFtPiAvL3N0ZDo6Y2luLGNvdXQsaW9zX2Jhc2UKI2luY2x1ZGUgPHZlY3Rvcj4gLy9zdGQ6OnZlY3RvcgojaW5jbHVkZSA8dHVwbGU+IC8vc3RkOjp0aWUKI2luY2x1ZGUgPGxpbWl0cy5oPiAvL0lOVF9NQVggKG5vIGBzdGQ6OicpCgojaW5jbHVkZSA8Ym9vc3QvZ3JhcGgvYWRqYWNlbmN5X2xpc3QuaHBwPgojaW5jbHVkZSA8Ym9vc3QvZ3JhcGgvZ3JhcGhfdHJhaXRzLmhwcD4KCiNpbmNsdWRlIDxib29zdC9ncmFwaC9wdXNoX3JlbGFiZWxfbWF4X2Zsb3cuaHBwPgoKdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwoKc3RydWN0IFZlcnRleFByb3BlcnRpZXN7Cgp9OwoKc3RydWN0IEVkZ2VQcm9wZXJ0aWVzewoJaW50IGlkOwoJaW50IGNhcGFjaXR5OwoJaW50IHJlc2lkdWFsX2NhcGFjaXR5Owp9OwoKdHlwZWRlZiBib29zdDo6YWRqYWNlbmN5X2xpc3Q8dmVjUyx2ZWNTLGRpcmVjdGVkUyxWZXJ0ZXhQcm9wZXJ0aWVzLEVkZ2VQcm9wZXJ0aWVzPiBHcmFwaDsKdHlwZWRlZiBib29zdDo6Z3JhcGhfdHJhaXRzPEdyYXBoPiBUcmFpdHM7CnR5cGVkZWYgVHJhaXRzOjp2ZXJ0ZXhfZGVzY3JpcHRvciBWZXJ0ZXg7CnR5cGVkZWYgVHJhaXRzOjplZGdlX2Rlc2NyaXB0b3IgRWRnZTsKCnZvaWQgZG9fYWRkX2VkZ2UoaW50JiBuZXh0X2lkLCBjb25zdCBWZXJ0ZXgmIGEsIGNvbnN0IFZlcnRleCYgYiwgY29uc3QgaW50IGMsIEdyYXBoJiBnLHN0ZDo6bWFwPEVkZ2UsRWRnZT4mIHJldmVyc2VfZWRnZV9vZik7CgppbnQgbWFpbihpbnQgYXJjLCBjaGFyKiBhcmd2W10pewoJc3RkOjppb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKCQoJaW50IG4gPSAzOyAvL25vZiB2ZXJ0aWNlcyAoID4yKQoJCglHcmFwaCBnKG4pOwoJCQoJVmVydGV4IHMgPSB2ZXJ0ZXgobi0yLGcpOyAvL3NvdXJjZQoJVmVydGV4IHQgPSB2ZXJ0ZXgobi0xLGcpOyAvL3NpbmsKCQoJVmVydGV4IHUgPSB2ZXJ0ZXgoMCxnKTsKCQoJc3RkOjptYXA8RWRnZSxFZGdlPiByZXZlcnNlX2VkZ2VfbWFwOwoJaW50IG5leHRfaWQgPSAwOwoJCglkb19hZGRfZWRnZShuZXh0X2lkLHMsdSwzLGcscmV2ZXJzZV9lZGdlX21hcCk7Cglkb19hZGRfZWRnZShuZXh0X2lkLHUsdCwxLGcscmV2ZXJzZV9lZGdlX21hcCk7CgkKCXN0ZDo6dmVjdG9yPGludD4gcmVzY2FwKG51bV9lZGdlcyhnKSk7CgkKCS8vd2h5IGRvZXNuJ3QgdGhpcyB3b3JrPwoJLyppbnQgbWF4ZmxvdyA9IHB1c2hfcmVsYWJlbF9tYXhfZmxvdygKCQlnLAoJCXMsCgkJdCwKCQljYXBhY2l0eV9tYXAoZ2V0KCZFZGdlUHJvcGVydGllczo6Y2FwYWNpdHksZykpCgkJLnJlc2lkdWFsX2NhcGFjaXR5X21hcChnZXQoJkVkZ2VQcm9wZXJ0aWVzOjpyZXNpZHVhbF9jYXBhY2l0eSxnKSkKCQkucmV2ZXJzZV9lZGdlX21hcChtYWtlX2Fzc29jX3Byb3BlcnR5X21hcChyZXZlcnNlX2VkZ2VfbWFwKSkKCQkudmVydGV4X2luZGV4X21hcChnZXQodmVydGV4X2luZGV4LGcpKQoJKTsqLwoJCgkvL3RoaXMgZG9lcyB3b3JrCglpbnQgbWF4ZmxvdyA9IHB1c2hfcmVsYWJlbF9tYXhfZmxvdygKCQlnLAoJCXMsCgkJdCwKCQlnZXQoJkVkZ2VQcm9wZXJ0aWVzOjpjYXBhY2l0eSxnKSwKCQlnZXQoJkVkZ2VQcm9wZXJ0aWVzOjpyZXNpZHVhbF9jYXBhY2l0eSxnKSwKCQltYWtlX2Fzc29jX3Byb3BlcnR5X21hcChyZXZlcnNlX2VkZ2VfbWFwKSwKCQlnZXQodmVydGV4X2luZGV4LGcpCgkpOwoJCglzdGQ6OmNvdXQgPDwgIm1heGZsb3cgPSAiIDw8IG1heGZsb3cgPDwgIlxuIjsKCglyZXR1cm4gMDsKfQoKdm9pZCBkb19hZGRfZWRnZShpbnQmIG5leHRfaWQsIGNvbnN0IFZlcnRleCYgYSwgY29uc3QgVmVydGV4JiBiLCBjb25zdCBpbnQgYywgR3JhcGgmIGcsc3RkOjptYXA8RWRnZSxFZGdlPiYgcmV2ZXJzZV9lZGdlX29mKXsKCUVkZ2UgZSxyZTsgYm9vbCBzdWNjZXNzOwoKCXN0ZDo6dGllKGUsc3VjY2VzcykgPSBhZGRfZWRnZShhLGIsZyk7CglnW2VdLmlkID0gbmV4dF9pZDsKCWdbZV0uY2FwYWNpdHkgPSBjOwoJZ1tlXS5yZXNpZHVhbF9jYXBhY2l0eSA9IGM7CgoJLy9yZXZlcnNlIGVkZ2UKCXN0ZDo6dGllKHJlLHN1Y2Nlc3MpID0gYWRkX2VkZ2UoYixhLGcpOwoJZ1tyZV0uaWQgPSBuZXh0X2lkICsgMTsKCWdbcmVdLmNhcGFjaXR5ID0gMDsKCWdbcmVdLnJlc2lkdWFsX2NhcGFjaXR5ID0gMDsKCglyZXZlcnNlX2VkZ2Vfb2ZbZV0gPSByZTsKCXJldmVyc2VfZWRnZV9vZltyZV0gPSBlOwoKCW5leHRfaWQgKz0gMjsKfQ==