#include using namespace leda; using namespace std; GRAPH G; void run_maxflow(GraphWin& gw) { edge e; edge_map f(G,0); //--------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------- forall_edges(e,G) gw.set_user_label(e,leda::string("%d",f[e]) + "/" + leda::string("%d",G[e])); } void init_edge(GraphWin& gw, edge e) { G[e] = rand_int(0,99); gw.set_slider_value(e,G[e]/100.0,0); } void init_handler(GraphWin& gw) { edge e; forall_edges(e,G) { init_edge(gw,e); } run_maxflow(gw); } void new_edge_handler(GraphWin& gw, edge e) { init_edge(gw,e); run_maxflow(gw); } void new_node_handler(GraphWin& gw, node v) { if(G.number_of_nodes() == 1) { gw.set_label_type(v,user_label); gw.set_user_label(v,"s"); gw.set_shape(v,square_node); gw.set_width(v,20); gw.set_color(v,blue); } if(G.number_of_nodes() == 2) { gw.set_label_type(v,user_label); gw.set_user_label(v,"t"); gw.set_shape(v,square_node); gw.set_width(v,20); gw.set_color(v,red); } run_maxflow(gw); } bool pre_del_node_handler(GraphWin& gw, node v) { node u = nil; if(G.number_of_nodes() > 2) { if(gw.get_user_label(v) == "s") { u = G.choose_node(); while(gw.get_user_label(u) == "t" || u == v) u = G.choose_node(); gw.set_label_type(u,user_label); gw.set_user_label(u,"s"); gw.set_shape(u,square_node); gw.set_width(u,20); gw.set_color(u,blue); } if(gw.get_user_label(v) == "t") { u = G.choose_node(); while(gw.get_user_label(u) == "s" || u == v) u = G.choose_node(); gw.set_label_type(u,user_label); gw.set_user_label(u,"t"); gw.set_shape(u,square_node); gw.set_width(u,20); gw.set_color(u,red); } } return true; } void del_node_handler(GraphWin& gw) { run_maxflow(gw); } void edge_slider_handler(GraphWin& gw, edge e, double f) { G[e] = int(100*f); run_maxflow(gw); } int main() { GraphWin gw(G); gw.set_node_label_type(no_label); gw.set_edge_label_type(user_label); gw.set_directed(true); gw.set_node_width(10); gw.set_init_graph_handler(init_handler); gw.set_new_edge_handler(new_edge_handler); gw.set_new_node_handler(new_node_handler); gw.set_del_edge_handler(run_maxflow); gw.set_del_node_handler(pre_del_node_handler); gw.set_del_node_handler(del_node_handler); gw.set_edge_slider_handler(edge_slider_handler); gw.display(); gw.edit(); }