public final List<List<E>> findShortestPath(final V initial, final V destination){
final List<E> shortestPath = dijkstraAlgorithm.getPath(initial, destination);
initialCostMap = dijkstraAlgorithm.getDistanceMap(initial);
final List<E> reversedShortestPath =
reverseUpdateEdgesWeight(graph, MapTransformer.getInstance(initialCostMap),
shortestPath, initial, destination);
discardCommonReversedEdges(graph, shortestPath, reversedShortestPath);
final List<E> unitedPaths = ListUtils.union(shortestPath, reversedShortestPath);
final List<E> resultPath1 = restorePaths(shortestPath, destination, unitedPaths);
final List<E> resultPath2 = restorePaths(reversedShortestPath, destination, unitedPaths);
List<List<E>> result = mergePaths(resultPath1, resultPath2);
if ((result == null) || (result.size() == 0)){
result = new ArrayList<>();
result.add(shortestPath);
}
return result;
}