#include <iostream>
#include <bpp/graph_problem/shortest_path.hpp>

using namespace bpp::graphProblemShortestPath;

class arc_data_t {
 public:
 //----------------------------------------------------Data
 tyReal distance;
 tyReal speed;
 //-------------------------------------Default Constructor
 arc_data_t(void) : distance(0.0),speed(0.0) {}
 //---------------------------------Constructor From Stream
 arc_data_t(clInStream & stream_,tyBoolean) {
  clString separator;
  stream_ >> distance >> separator >> speed;
 }
 //--------------------------------------Output Into Stream
 void out(clOutStream & stream_,tyBoolean) const {
  stream_ << distance << " , " << speed;
 }
 //--------------------------------------------------Length
 tyReal length(void) { return distance/speed; }
};

class node_data_t {
 public:
 //----------------------------------------------------Data
 clString name;
 //-------------------------------------Default Constructor
 node_data_t(void) : name("") {}
 //---------------------------------Constructor From Stream
 node_data_t(clInStream & stream_,tyBoolean)
 { stream_ >> name; }
 //--------------------------------------Output Into Stream
 void out(clOutStream & stream_,tyBoolean) const
 { stream_ << name; }
};

typedef clDijkstraAlgo<arc_data_t,node_data_t> algo_t;
typedef clArc<arc_data_t,node_data_t>          arc_t;
typedef clGraph<arc_data_t,node_data_t>        network_t;
typedef clNode<arc_data_t,node_data_t>         node_t;
typedef std::vector<arc_t *>                   path_t;

#include <bpp/display/console.hpp>

int main(void) {
 // B++ Library Initialization //
 bpp::displayConsole::clDisplay display;
 bpp::standard::openLibrary(display);

 try {
  // Local Variables //
  clInFile  input;
  network_t network;
  clOutFile output;
  path_t    path;

  // Input Reading //
  input.open("network.dat",ios::in);
  input >> network;
  input.close();

  // Shortest Path Resolution //
  algo_t().run(network,0,6,path);

  // Output Writing //
  output.open("path.dat",ios::out);
  output << "Path = " << path;
  output.close();
 }

 catch (...)
 { std::cout << "An error occurred !" << std::endl; }

 // B++ Library Termination //
 bpp::standard::closeLibrary();

 exit(0);
}