protected HashMap<PhysicalNode, Path> getPathsFromNode(PhysicalNode physicalSourceNode,
                                            SubstrateNetwork substrateNetwork) {
    SimpleWeightedGraph<Node, DefaultWeightedEdge> graph =
      new SimpleWeightedGraph<Node, DefaultWeightedEdge>(DefaultWeightedEdge.class);
    for(PhysicalNode physicalNode : substrateNetwork.getHashNodes().values())
        graph.addVertex(physicalNode);
    for(PhysicalLink physicalLink : substrateNetwork.getHashLinks().values()) {
      DefaultWeightedEdge edge = graph.addEdge(physicalLink.getSourceNode(),
        physicalLink.getDestinyNode());
      graph.setEdgeWeight(edge, physicalLink.getDelay());
    }

    HashMap<PhysicalNode, Path> paths = new HashMap<PhysicalNode, Path>();
    for(PhysicalNode physicalNode : substrateNetwork.getHashNodes().values()) {
      if(!physicalNode.equals(physicalSourceNode)) {
        Path path = new Path(physicalSourceNode, physicalNode);
        List<DefaultWeightedEdge> edgesPath = DijkstraShortestPath.findPathBetween(
          graph, physicalSourceNode, physicalNode);
        if(edgesPath != null) { // FIXME este if é necessário?
          for(DefaultWeightedEdge edge : edgesPath) {
            PhysicalLink physicalLink = substrateNetwork.getHashLinks().get(
              String.format("%s:%s", graph.getEdgeSource(edge).getId(),
                graph.getEdgeTarget(edge).getId()));
            if(physicalLink != null) {
              path.addLink(physicalLink);
            }
          }
        }

        if(!path.isEmpty())
          paths.put(physicalNode, path);
      }
    }

    return paths;
  }