weight_t graph_maxflow(graph_t*graph, node_t*pos1, node_t*pos2) { int max_flow = 0; graphcut_workspace_t* w = graphcut_workspace_new(graph, pos1, pos2); graph_reset(graph); DBG check_graph(graph); posqueue_addpos(w->queue1, pos1); w->flags1[pos1->nr] |= ACTIVE|IN_TREE; posqueue_addpos(w->queue2, pos2); w->flags2[pos2->nr] |= ACTIVE|IN_TREE; DBG workspace_print(w); while(1) { path_t*path; while(1) { char done1=0,done2=0; node_t* p1 = posqueue_extract(w->queue1); if(!p1) { graphcut_workspace_delete(w); return max_flow; } DBG printf("extend 1 from %d (%d edges)\n", NR(p1), node_count_edges(p1)); path = expand_pos(w, w->queue1, p1, 0, w->flags1, w->flags2); if(path) break; DBG workspace_print(w); #ifdef TWOTREES node_t* p2 = posqueue_extract(w->queue2); if(!p2) { graphcut_workspace_delete(w); return max_flow; } DBG printf("extend 2 from %d (%d edges)\n", NR(p2), node_count_edges(p2)); path = expand_pos(w, w->queue2, p2, 1, w->flags2, w->flags1); if(path) break; DBG workspace_print(w); #endif } DBG printf("found connection between tree1 and tree2\n"); DBG path_print(path); DBG printf("decreasing weights\n"); max_flow += decrease_weights(graph, path); DBG workspace_print(w); DBG printf("destroying trees\n"); combust_tree(w, w->queue1, w->queue2, path); DBG workspace_print(w); DBG check_graph(w->graph); path_delete(path); } graphcut_workspace_delete(w); return max_flow; }
/** * clears the screen */ void dev_cls() { graph_reset(); osd_cls(); }