以下に示すように、C++ で隣接行列を使用して Floyd Warshall アルゴリズムを実装しましたが、(i,j,k) インデックスをループするのに非常に便利な隣接行列表現を使用しました。隣接リストの再作成でこれを達成する方法はありますか? http://mcs.uwsuper.edu/sb/425/Prog/FloydWarshall.javaこのサイトでも、アルゴリズムを適用する前に隣接リストをマトリックスに変換することがわかりました。
int rowSize = numberOfGraphVertices, colSize = numberOfGraphVertices ;
std::vector<int> shortestPathMatrix(rowSize * colSize, 10000000);
for (int i = 0; i < rowSize; ++i) shortestPathMatrix[i + i * colSize] = 0 ;
cout << "Done" << endl ;
int numEdges = 0;
while(getline(infile, graphString)) // To get you all the lines.
{
pch = strtok_s(const_cast<char *> (graphString.c_str())," ", &p2);
int rowNumber = atoi(pch);
//graphListVector[node1] =
pch = strtok_s(NULL, " ", &p2);
int colNumber = atoi(pch);
pch = strtok_s(NULL, " ", &p2);
int edgeWeight = atoi(pch);
shortestPathMatrix[(rowNumber-1)*colSize + (colNumber-1)] = edgeWeight;
++numEdges;
}
cout<< "numberOfVertices"<<numberOfGraphVertices<<"NumberOfEdges"<< numEdges <<endl;
t = clock();
//for (int i = 0 ; i < 1002 ; ++i) cout << "Value" << i <<" " << shortestPathMatrix[i] << endl;
for (int k = 0 ; k < rowSize ; ++k){
for (int i = 0 ; i < rowSize ; ++i){
for (int j = 0; j < rowSize ; ++j){
if ( shortestPathMatrix[j*colSize + i] + shortestPathMatrix[i*colSize + k] < shortestPathMatrix[j*colSize + k])
shortestPathMatrix[j*colSize + k] = shortestPathMatrix[j*colSize + i] + shortestPathMatrix[i*colSize + k];
}
}
}
for (int i = 0; i < rowSize; ++i) {
if (shortestPathMatrix[i + i * colSize] < 0) cout << "Negative cycle found" << endl;
break;
}
std::vector<int>::iterator minShortestPathIndex = std::min_element (shortestPathMatrix.begin(), shortestPathMatrix.end());