Hi,
ich habe hier eine Methode, auf Basis des Floyd-Warshall Algos.
Dieser klappt auch soweit,
Nun soll aber neben der kürzesten Distanz, noch der Weg ausgegeben werden, der gefahren wird.
z.Z gibt er mir alle Orte aus, welche er im Zuge der Berechnung des kürzesten Weges besucht aus.
Aber das er mir den Weg ausgibt, den man fahren muss, um die kürzeste route zu nehmen bekomme ich nicht hin.
ich habe hier eine Methode, auf Basis des Floyd-Warshall Algos.
Dieser klappt auch soweit,
Nun soll aber neben der kürzesten Distanz, noch der Weg ausgegeben werden, der gefahren wird.
z.Z gibt er mir alle Orte aus, welche er im Zuge der Berechnung des kürzesten Weges besucht aus.
Aber das er mir den Weg ausgibt, den man fahren muss, um die kürzeste route zu nehmen bekomme ich nicht hin.
C++:
double Floyd2(string x, string y) //Übergabe x=start_ort y=ziel:ort
{
int v = consist_of(x);
int w = consist_of(y);
string weg = "";
if(v != -1 && w != -1)
{
const double infinit = numeric_limits<double>::infinity(); // (MAXFLOAT = unendlich) HUGE_VAL
double *C = new double[vertex.size()*vertex.size()]; // Kostenmatrix
for (int i=0; i<vertex.size(); i++) // Kostenmatrix initialisieren
for (int j=0; j<vertex.size(); j++)
if (IsArc(i,j))
C[i*vertex.size()+j] = GetArc(i,j);// C[i,j] mit Kantengew. belegen
else
C[i*vertex.size()+j] = infinit; // C[i,j] mit unendlich belegen
for (int i=0; i<vertex.size(); i++) // Kostenmatrix initialisieren
for (int j=0; j<vertex.size(); j++)
if (i == j ) C[i*vertex.size()+j] = 0; // C[i,i] = 0
for (int k=0; k<vertex.size(); k++)
for (int i=0; i<vertex.size(); i++)
for (int j=0; j<vertex.size(); j++)
if (C[i*vertex.size()+j] > C[i*vertex.size()+k] + C[k*vertex.size()+j])
{ //weg zusammen setzten
if(vertex[k].visited == false)
{
weg+= vertex[k].value+ " ";
vertex[j].visited = true;
}
C[i*vertex.size()+j] = C[i*vertex.size()+k] + C[k*vertex.size()+j];
}
for(int i=0;i<vertex.size();i++) //Konten wieder auf visited = false setzten
{
vertex[i].visited = false;
}
//überprüfen ob es überhaupt einen Weg gibt
if(C[v*vertex.size()+w] != numeric_limits<double>::infinity())
{
cout << weg <<endl;
return C[v*vertex.size()+w];
}
else
return -1;
}
return -1;
}