Changed opt2, opt3 and greedy to take a Graph as argument

This lets us perform the preprocessing only once
Only compute the distances for the triangular matrix (and mirror it)
Changed std::vector<int> that is used as the path to be typedef Path

Makes it possible to change the representation more easily.

Tested with std::vector<short> but it gave no improvement