void Graph<captype,tcaptype,flowtype>::augment(arc *middle_arc) { node *i; arc *a; tcaptype bottleneck; /* 1. Finding bottleneck capacity */ /* 1a - the source tree */ bottleneck = middle_arc -> r_cap; for (i=middle_arc->sister->head; ; i=a->head) { a = i -> parent; if (a == TERMINAL) break; if (bottleneck > a->sister->r_cap) bottleneck = a -> sister -> r_cap; } if (bottleneck > i->tr_cap) bottleneck = i -> tr_cap; /* 1b - the sink tree */ for (i=middle_arc->head; ; i=a->head) { a = i -> parent; if (a == TERMINAL) break; if (bottleneck > a->r_cap) bottleneck = a -> r_cap; } if (bottleneck > - i->tr_cap) bottleneck = - i -> tr_cap; /* 2. Augmenting */ /* 2a - the source tree */ middle_arc -> sister -> r_cap += bottleneck; middle_arc -> r_cap -= bottleneck; for (i=middle_arc->sister->head; ; i=a->head) { a = i -> parent; if (a == TERMINAL) break; a -> r_cap += bottleneck; a -> sister -> r_cap -= bottleneck; if (!a->sister->r_cap) { set_orphan_front(i); // add i to the beginning of the adoption list } } i -> tr_cap -= bottleneck; if (!i->tr_cap) { set_orphan_front(i); // add i to the beginning of the adoption list } /* 2b - the sink tree */ for (i=middle_arc->head; ; i=a->head) { a = i -> parent; if (a == TERMINAL) break; a -> sister -> r_cap += bottleneck; a -> r_cap -= bottleneck; if (!a->r_cap) { set_orphan_front(i); // add i to the beginning of the adoption list } } i -> tr_cap += bottleneck; if (!i->tr_cap) { set_orphan_front(i); // add i to the beginning of the adoption list } flow += bottleneck; }
void QPBO<REAL>::augment(Arc *middle_arc) { Node *i; Arc *a; REAL bottleneck; /* 1. Finding bottleneck capacity */ /* 1a - the source tree */ bottleneck = middle_arc -> r_cap; for (i=middle_arc->sister->head; ; i=a->head) { a = i -> parent; if (a == QPBO_MAXFLOW_TERMINAL) break; if (bottleneck > a->sister->r_cap) bottleneck = a -> sister -> r_cap; } if (bottleneck > i->tr_cap) bottleneck = i -> tr_cap; /* 1b - the sink tree */ for (i=middle_arc->head; ; i=a->head) { a = i -> parent; if (a == QPBO_MAXFLOW_TERMINAL) break; if (bottleneck > a->r_cap) bottleneck = a -> r_cap; } if (bottleneck > - i->tr_cap) bottleneck = - i -> tr_cap; /* 2. Augmenting */ /* 2a - the source tree */ middle_arc -> sister -> r_cap += bottleneck; middle_arc -> r_cap -= bottleneck; for (i=middle_arc->sister->head; ; i=a->head) { a = i -> parent; if (a == QPBO_MAXFLOW_TERMINAL) break; a -> r_cap += bottleneck; a -> sister -> r_cap -= bottleneck; if (!a->sister->r_cap) { set_orphan_front(i); // add i to the beginning of the adoption list } } i -> tr_cap -= bottleneck; if (!i->tr_cap) { set_orphan_front(i); // add i to the beginning of the adoption list } /* 2b - the sink tree */ for (i=middle_arc->head; ; i=a->head) { a = i -> parent; if (a == QPBO_MAXFLOW_TERMINAL) break; a -> sister -> r_cap += bottleneck; a -> r_cap -= bottleneck; if (!a->r_cap) { set_orphan_front(i); // add i to the beginning of the adoption list } } i -> tr_cap += bottleneck; if (!i->tr_cap) { set_orphan_front(i); // add i to the beginning of the adoption list } }