private void discharge(Vertex u) {
    // System.out.println("Discharging " + u);
    while (u.getExcess() > 0) {
      if (u.getCurrNeighbor() >= u.getNumNeighbors()) {
        relabel(u);
        u.setCurrNeighbor(0);
      } else {
        Vertex v = u.getNeighbor(u.getCurrNeighbor());

        if (getResidualCapacity(u, v) > 0 && u.getHeight() == v.getHeight() + 1) {
          push(u, v);
        } else {
          u.incNextNeighbor();
        }
      }
    }
  }
  private void setupSourceSide(Set<Employee> emps) {
    for (Employee e : emps) {
      Vertex u = Vertex.vertexFromEmployee(e);
      LV.add(u);

      source.addToNeighbors(u);
      u.addToNeighbors(source);

      setCapacity(source, u, 1);
      setFlow(source, u, 1);
      u.setExcess(1);

      // Prioritize friend for initial flow
      if (e.getId() == ProjectParams.FRIEND_ID) {
        V.addFirst(u);
      } else {
        V.add(u);
      }
    }

    source.setExcess(source.getExcess() - source.getNumNeighbors());
  }