private void algo() {

		// Step 1 -
		// initialize the zero flow (if none is given)
		// mark Quelle
		init();

		// Step 2
		// save the current to be inspected Vertice into vi.
		// end loop, if there are no more.
		for (Long vi = popFromQueue(); vi != -1L; vi = popFromQueue()) {

			// filter all edges by O(vi) and I(vi).
			List<Set<Long>> partition = makeInOutPartitionOf(vi);
			Set<Long> incoming = partition.get(0);
			Set<Long> outgoing = partition.get(1);

			// Forward-edges
			for (Long eID : outgoing) {
				increaseAccess(); // Zugriff auf ein Edge
				long vj = graph.getTarget(eID);

				// make the forward-mark of for every edge that goes from vi to
				// an yet unmarked
				if (!verticeIsMarked(vj) && f(eID) < c(eID)) {
					saveForwardEdge(eID, vj, vi);
				}
			}

			// Backward-edges
			for (Long eID : incoming) {
				increaseAccess(); // Zugriff auf ein Edge
				long vj = graph.getSource(eID);

				// make the backward-mark of for every edge that goes from vi to
				// an yet unmarked vj
				if (!marked.containsKey(vj) && f(eID) > 0) {
					saveBackwardEdge(eID, vj, vi);
				}
			}
			
			// an dieser Stelle im Code wurde frueher der Vertice als inspected
			// gesetzt. In EdmondsKarp passiert dies schon beim Entnehmen aus der Queue.
			
			// Step 3
			// if the senke/destination was reached(marked) then augment the flow
			if (verticeIsMarked(destId)) {
				// step three. calculate the augmenting path and update the flow
				updateByAugmentingPath();
			}
		}

		// Step 4
		// we're finished now!

	}