@Override
  public void compute(
      Vertex<IntWritable, IntWritable, NullWritable> vertex, Iterable<IntWritable> messages)
      throws IOException {
    int currentLength = vertex.getValue().get();
    // First superstep is special, because we can simply look at the neighbors
    if (getSuperstep() == 0) {
      if (isSource(vertex)) {
        vertex.setValue(new IntWritable(0));
        sendMessageToAllEdges(vertex, vertex.getValue());
      } else {
        vertex.setValue(new IntWritable(Integer.MAX_VALUE));
      }
      vertex.voteToHalt();
      return;
    }

    boolean changed = false;
    // did we get a smaller length ?
    for (IntWritable message : messages) {
      int candidateLength = message.get() + 1;
      if (candidateLength < currentLength) {
        currentLength = candidateLength;
        changed = true;
      }
    }

    // propagate new length to the neighbors
    if (changed) {
      vertex.setValue(new IntWritable(currentLength));
      sendMessageToAllEdges(vertex, vertex.getValue());
    }
    vertex.voteToHalt();
  }
  // public static double level=0;
  @Override
  public void compute(
      Vertex<LongWritable, DoubleWritable, FloatWritable> v, Iterable<DoubleWritable> msg)
      throws IOException {

    if (getSuperstep() == 0) {
      if (isSource(v) == true) {
        v.setValue(new DoubleWritable(0));
        //			 level++;
        sendMessageToAllEdges(v, new DoubleWritable(v.getId().get()));
      } else v.setValue(new DoubleWritable(-1));
    } else {

      for (DoubleWritable messages : msg) {

        if (v.getValue().get() == -1) {
          v.setValue(messages);
          for (Edge<LongWritable, FloatWritable> edge : v.getEdges()) {
            if (edge.getTargetVertexId().get() != v.getValue().get()) {
              sendMessage(edge.getTargetVertexId(), new DoubleWritable(v.getId().get()));
            }
          }

        } else {
          if (v.getValue().get() != messages.get()) {
            removeEdgesRequest(v.getId(), new LongWritable((long) messages.get()));
            removeEdgesRequest(new LongWritable((long) messages.get()), v.getId());
          }
        }

        /*

        	if(v.getValue().get() >  messages.get())
        	{
        		v.setValue(new DoubleWritable(getSuperstep()));
        //		changed=true;
        	}*/
      }
      if (v.getValue().get() == -1) {
        for (Edge<LongWritable, FloatWritable> edge : v.getEdges()) {
          if (edge.getTargetVertexId().get() != v.getValue().get())
            sendMessage(edge.getTargetVertexId(), new DoubleWritable(v.getId().get()));
        }
      }
      /*	if(changed)
      {
      	level++;
      	sendMessageToAllEdges(v,new DoubleWritable(level));
      	changed=false;
      }*/
    }
    v.voteToHalt();
  }
  @Override
  public void compute(
      Vertex<IntWritable, IntWritable, NullWritable> vertex, Iterable<IntWritable> messages)
      throws IOException {

    if (0 == getSuperstep()) {
      vertex.setValue(new IntWritable(Integer.MAX_VALUE));
    }

    Integer minDist = isSource(vertex) ? 0 : Integer.MAX_VALUE;
    for (IntWritable msg : messages) {
      if (msg.get() < minDist) {
        minDist = msg.get();
      }
    }

    if (minDist < vertex.getValue().get()) {
      vertex.setValue(new IntWritable(minDist));

      for (Edge<IntWritable, NullWritable> edge : vertex.getEdges()) {
        final IntWritable neighbor = edge.getTargetVertexId();
        final Integer distance = minDist + 1;

        sendMessage(neighbor, new IntWritable(distance));
      }
    }

    vertex.voteToHalt();
  }
  /**
   * Propagates the smallest vertex id to all neighbors. Will always choose to halt and only
   * reactivate if a smaller id has been sent to it.
   *
   * @param messages Iterator of messages from the previous superstep.
   * @throws java.io.IOException
   */
  @Override
  public void compute(
      Vertex<LongWritable, LongWritable, NullWritable> vertex, Iterable<LongWritable> messages)
      throws IOException {
    long currentComponent = vertex.getValue().get();

    // First superstep is special, because we can simply look at the neighbors
    if (getSuperstep() == 0) {
      for (Edge<LongWritable, NullWritable> edge : vertex.getEdges()) {
        long neighbor = edge.getTargetVertexId().get();
        if (neighbor < currentComponent) {
          currentComponent = neighbor;
        }
      }
      // Only need to send value if it is not the own id
      if (currentComponent != vertex.getValue().get()) {
        vertex.setValue(new LongWritable(currentComponent));
        for (Edge<LongWritable, NullWritable> edge : vertex.getEdges()) {
          LongWritable neighbor = edge.getTargetVertexId();
          if (neighbor.get() > currentComponent) {
            sendMessage(neighbor, vertex.getValue());
          }
        }
      }

      vertex.voteToHalt();
      return;
    }

    boolean changed = false;
    // did we get a smaller id ?
    for (LongWritable message : messages) {
      long candidateComponent = message.get();
      if (candidateComponent < currentComponent) {
        currentComponent = candidateComponent;
        changed = true;
      }
    }

    // propagate new component id to the neighbors
    if (changed) {
      vertex.setValue(new LongWritable(currentComponent));
      sendMessageToAllEdges(vertex, vertex.getValue());
    }
    vertex.voteToHalt();
  }