Mám takový problém a jsem celkem v koncích. Jsem ochotný zaplatit formou například kreditu na mobilní sítě ČR, neboť můj problém celkem hoří (je to úkol v rámci jendoho projektu).
Jedná se o Floyd-Warshallův algoritmus, jehož základ jsem našel v této podobě (posléze jsem se ho pokusil upravit, nicméně stále neúspěšně, takže pošlu základní tvar).
#include <vector>
#include <iostream>
#include <string>
using namespace std;
typedef vector<int> Column;
typedef vector<Column> Matrix;
void path(int start, int dest, Matrix& paths);
int main(int argc, char* argv[])
{
int n; //number of vertices
cout<<"Please enter the number of vertices: "<<endl;
cin>>n;
cout<<endl;
Matrix wMatrix;
Matrix paths;
// get weight matrix
cout<<"please fill the adjacency matrix, use -1 for absent paths:"<<endl;
int temp=0;
for (int i=1; i<=n; i++)
{
Column column, tempcolumn;
for (int j=1; j<=n; j++)
{
cout<<"W["<<i<<"]["<<j<<"]: ";
cin>>temp;
if(temp==-1) temp= 65536;
column.push_back(temp);
tempcolumn.push_back(-1);
}
wMatrix.push_back(column);
paths.push_back(tempcolumn);
}
// floyd algorithm
for (int k=0; k<n; k++)
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
if (wMatrix[i][k]+wMatrix[k][j] < wMatrix[i][j])
{
paths[i][j] = k;
wMatrix[i][j] = wMatrix[i][k]+wMatrix[k][j];
}
// give shortest path
while(true)
{
int start,dest;
string answer;
cout<<"Please enter the number of start vertex: ";
cin>>start;
cout<<"and destination: ";
cin>>dest;
cout<<endl;
cout<<"Intermediate vertices:";
path(start-1,dest-1,paths);
cout<<endl<<endl<<"Do you want to find another shortest path?(yes or no) ";
cin>>answer;
if( answer != "yes" )
break;
}
return 0;
}
void path(int start, int dest, Matrix& paths)
{
if (paths[start][dest] != -1)
{
path(start, paths[start][dest],paths);
cout<<"->"<<paths[start][dest]+1;
path(paths[start][dest],dest,paths);
}
}
Problém, je zřejmě zde, kde podmínka se vždy rovná -1 (nebo při všech dosavadních zkouškách)
void path(int start, int dest, Matrix& paths)
{
if (paths[start][dest] != -1)
{
path(start, paths[start][dest],paths);
cout<<"->"<<paths[start][dest]+1;
path(paths[start][dest],dest,paths);
}
}
Za případnou pomoc vřele děkuji.