@Override
	public boolean execute(double perc) {
		clearVar();
		
		preExecute(perc);
    	
		//sorting terminals list
		for (int i = 0; i < terminals.length; i++) {
			sortedTerminals.add(new S2DDelay(source, terminals[i], spTerCosts[i]));
		}
		Collections.sort(sortedTerminals, new S2DDelayComparator());
		HashSet unmarked, marked;
		
		
		unmarked = new HashSet<Integer>();
		marked = new HashSet<Integer>();
		unmarked.add(source);
		informedSet.add(new Integer(source));
		
		uninformedAdjl.deleteNode(source);
    	uninformedAdjMatrix.fillMatrixFromAdjList(uninformedAdjl);
    	uninformedAdjMatrix.minCostPaths();		
		
		while(sortedTerminals.size() > 0) {
			ArrayList<S2DDelay> nextList = getNextSqrtTerm();
			
			uninformedTerminals = new ArrayList<Integer>(nextList.size());
			uninformedTerminalsDelay = new ArrayList<Double>(nextList.size());
			
			ArrayList<ElkinItem> v2Set = new ArrayList<ElkinItem>(nextList.size());
			//building v2Set
			for (int i = 0; i < nextList.size(); i++) {
				v2Set.add(new ElkinItem(null, new Node(nextList.get(i).getDestination())));
				uninformedTerminals.add(nextList.get(i).getDestination());
				uninformedTerminalsDelay.add(nextList.get(i).getDelay());
			}
			
			ArrayList<Integer> uncoveredV2 = new ArrayList<Integer>();
			//unmarked = subconjunto dos nos de I nao-marcados
			//uncoveredV2 = subset de uninformedTerminals que nao possuem arestas para os mesmos
			ArrayList<Group> groups = setMSCGroups(unmarked, uncoveredV2, false);
			if (uncoveredV2.size() > 0) {
				groups.addAll(setV1ToCoverNextTer(marked, informedSet, uncoveredV2));
			}
			
			//22/03 - It seems like this function is only important to set chosenItem
			procDistDom(groups, v2Set);
			
	    	//adding new edges to the arborescence
	    	addingTreesForDomSet(uninformedTerminals);
	    	
	    	updateInformedSet(quasiArborescence, source);
	    	
	    	//updating marked and unmarked set
	    	Iterator<PseudoNode> markedIt = realChosenPseudo.iterator();
	    	while (markedIt.hasNext()) {
	    		PseudoNode ps = markedIt.next();
	    		int value = ps.getInformed().getId();
	    		marked.add(value);
	    	}
	    	unmarked.addAll(informedSet);
	    	unmarked.removeAll(marked);
	    	
	    	//updating sortedTerminals and uninformedAdjl lists by eliminating nodes
	    	for (int j = 0; j < size; j++) {
	    		if ((quasiArborescence.getList(j) != null) //if there is a list for j in quasiArborescence then this node is in the final arborescence and it is not an uninformed terminal anymore  
	    				|| (uninformedTerminals.contains(new Integer(j)))) { //if j was one of the next terminals to be removed, so it is not an uninformed terminal anymore
	    			uninformedAdjl.deleteNode(j);
	    		}
	    	}
	    	//deleting terminals which were covered even they were not members of nextList
	    	deleteCoveredTerminals();
	    	
        	uninformedAdjMatrix.refillMatrix();
        	uninformedAdjMatrix.minCostPaths();	
        	
        	if (!flagViolatedTerminals) {
        		flagViolatedTerminals = true;
        		setViolatedTerminals();
        	}
		}
		
		return true;
	}