public static void main(String[] args) {

    TAP tap = TAP.BRAESS(TADriver.class);

    List<String> odpairs = new ArrayList<>(tap.getOdpairs().keySet());
    Collections.sort(odpairs);
    String header = "average_tt";
    String results = "";

    // calculate all-shortest-path
    FloydWarshallShortestPaths fws = new FloydWarshallShortestPaths(tap.getGraph());

    // update the edges cost
    for (String odPair : odpairs) {
      String origin = odPair.split("-")[0];
      String destination = odPair.split("-")[1];

      GraphPath path = fws.getShortestPath(origin, destination);

      for (Object e : path.getEdgeList()) {
        StandardEdge edge = (StandardEdge) e;
        edge.incrementTotalFlow(tap.getOdpairs().get(odPair).demandSize());
      }
    }

    // evaluate cost per OD pair
    for (String odPair : odpairs) {
      header += Params.COLUMN_SEPARATOR + odPair;

      String origin = odPair.split("-")[0];
      String destination = odPair.split("-")[1];

      results += Params.COLUMN_SEPARATOR + fws.getShortestPath(origin, destination).getWeight();
    }

    // print Result
    List<AbstractEdge> edges = new ArrayList<>(tap.getGraph().edgeSet());
    Collections.sort(edges);
    double cost = 0.0;

    for (AbstractEdge e : edges) {
      header += Params.COLUMN_SEPARATOR + e.getName();
      results += Params.COLUMN_SEPARATOR + e.getTotalFlow();
      cost += (e.getCost() * e.getTotalFlow()) / tap.getDrivers().size();
    }
    System.out.println(header);
    System.out.println(cost + results);
  }
 private static List<String> shortestCycle(DirectedGraph<String, DefaultEdge> graph) {
   FloydWarshallShortestPaths<String, DefaultEdge> floyd = new FloydWarshallShortestPaths<>(graph);
   int minDistance = Integer.MAX_VALUE;
   String minSource = null;
   String minDestination = null;
   for (DefaultEdge edge : graph.edgeSet()) {
     String src = graph.getEdgeSource(edge);
     String dst = graph.getEdgeTarget(edge);
     int dist = (int) Math.round(floyd.shortestDistance(dst, src)); // from dst to src
     if (dist < 0) {
       continue;
     }
     if (dist < minDistance) {
       minDistance = dist;
       minSource = src;
       minDestination = dst;
     }
   }
   if (minSource == null) {
     return null;
   }
   GraphPath<String, DefaultEdge> shortestPath = floyd.getShortestPath(minDestination, minSource);
   List<String> pathVertexList = Graphs.getPathVertexList(shortestPath);
   // note: pathVertexList will be [a, a] instead of [a] when the shortest path is a loop edge
   if (!Objects.equals(shortestPath.getStartVertex(), shortestPath.getEndVertex())) {
     pathVertexList.add(pathVertexList.get(0));
   }
   return pathVertexList;
 }