@Override
	public <V,E> FeedbackArcSet<V,E> getFeedbackArcSet(Digraph<V,E> digraph, EdgeWeights<? super V> weights, FeedbackArcSetPolicy policy) {
		if (digraph.isAcyclic()) {
			return new FeedbackArcSet<V, E>(Digraphs.<V, E>emptyDigraph(), 0, policy, true);
		}
		if (decompose) {
			List<FeedbackTask<V,E>> tasks = new ArrayList<FeedbackTask<V,E>>();
			for (Set<V> component : Digraphs.scc(digraph)) {
				if (component.size() > 1) {
					tasks.add(new FeedbackTask<V, E>(digraph, weights, policy, component));
				}
			}

			List<FeedbackArcSet<V,E>> feedbacks = executeAll(tasks);
			if (feedbacks == null) {
				return null;
			}

			int weight = 0;
			boolean exact = true;
			Digraph<V, E> result = new MapDigraph<V, E>();
			for (FeedbackArcSet<V,E> feedback : feedbacks) {
				for (V source : feedback.vertices()) {
					for (V target : feedback.targets(source)) {
						result.put(source, target, digraph.get(source, target));
					}
				}
				exact &= feedback.isExact();
				weight += feedback.getWeight();
			}
			return new FeedbackArcSet<V, E>(result, weight, policy, exact);
		} else {
			return fas(digraph, weights, policy);
		}
	}