public void setAsVisited(AbstractElement e) {
    if (e instanceof Edge) {
      if (e.getVisitedKey() < 1) {
        numOfCoveredEdges++;
      }
    } else if (e instanceof Vertex) {
      if (e.getVisitedKey() < 1) {
        numOfCoveredVertices++;
      }
    }

    e.setVisitedKey(e.getVisitedKey() + 1);

    if (!e.getReqTagKey().isEmpty()) {
      Hashtable<String, Integer> reqs = getAllRequirements();
      String[] tags = e.getReqTagKey().split(",");
      for (String tag : tags) {
        reqs.put(tag, reqs.get(tag) + 1);
      }
    }
  }
  public void setAsUnvisited(AbstractElement e) {
    Integer visits = e.getVisitedKey();
    e.setVisitedKey(e.getVisitedKey() - 1);
    if (e instanceof Edge) {
      if (e.getVisitedKey() < 1) {
        numOfCoveredEdges--;
      }
    } else if (e instanceof Vertex) {
      if (e.getVisitedKey() < 1) {
        numOfCoveredVertices--;
      }
    }

    if (visits <= 0) logger.error(e + ", has a negative number in VISITED_KEY");

    if (!e.getReqTagKey().isEmpty()) {
      Hashtable<String, Integer> reqs = getAllRequirements();
      String[] tags = e.getReqTagKey().split(",");
      for (String tag : tags) {
        reqs.put(tag, reqs.get(tag) - 1);
      }
    }
  }
  public Hashtable<String, Integer> getAllRequirements() {
    if (associatedRequirements == null) {
      associatedRequirements = new Hashtable<String, Integer>();

      Vector<AbstractElement> abstractElements = new Vector<AbstractElement>();
      abstractElements.addAll(getAllVertices());
      abstractElements.addAll(getAllEdges());

      for (AbstractElement abstractElement : abstractElements) {
        String reqtags = abstractElement.getReqTagKey();
        if (!reqtags.isEmpty()) {
          String[] tags = reqtags.split(",");
          for (String tag : tags) {
            associatedRequirements.put(tag, 0);
          }
        }
      }
    }
    return associatedRequirements;
  }