Beispiel #1
0
 def process(self):
     while self._has_augmenting_path(self._source, self._sink):
         while True:
             common.fill_with_value(self._blocked, False)
             delta = self._send_flow(float('inf'), self._source, self._sink,
                                     self._blocked)
             self._flow += delta
             if delta == 0:
                 break
             print('flow: {0}'.format(self._flow))
Beispiel #2
0
 def _has_augmenting_path(self, s: int, t: int):
     common.fill_with_value(self._levels, -1)
     q = queue.Queue()
     q.put(s)
     self._levels[s] = 0
     while not q.empty():
         v = q.get()
         for edge in self._graph.adj(v):
             w = edge.other(v)
             if self._levels[w] < 0 and edge.residual_capacity_to(w) > 0:
                 self._levels[w] = self._levels[v] + 1
                 q.put(w)
     return self._levels[t] >= 0
 def _has_augmenting_path(self, s: int, t: int):
     common.fill_with_value(self._edge_to, None)
     common.fill_with_value(self._marked, False)
     q = queue.Queue()
     q.put(s)
     self._marked[s] = True
     while not q.empty():
         v = q.get()
         for edge in self._graph.adj(v):
             w = edge.other(v)
             if edge.residual_capacity_to(w) > 0 and not self._marked[w]:
                 self._edge_to[w] = edge
                 self._marked[w] = True
                 q.put(w)
     return self._marked[t]
    def _recompute_heights(self):
        print('recompute_heights')
        common.fill_with_value(self._visited, False)
        common.fill_with_value(self._heights, 2 * self._graph.vertices())

        self._heights[self._sink] = 0
        self._heights[self._source] = self._graph.vertices()
        self._visited[self._sink] = True
        self._visited[self._source] = True

        q = queue.Queue()
        q.put(self._sink)
        self._process_queue_till_empty(q)
        q.put(self._source)
        self._process_queue_till_empty(q)

        self._relabel_counter = 0