基于邻接表的Floyd-Warshall算法 < P>我使用C++中的邻接矩阵实现了弗洛依德WARWEDE算法,但我使用邻接矩阵表示,这使得它很方便地循环(i,j,k)索引。有没有一种方法可以在邻接列表表示中实现这一点?我看到,即使是这个网站在应用算法之前

基于邻接表的Floyd-Warshall算法 < P>我使用C++中的邻接矩阵实现了弗洛依德WARWEDE算法,但我使用邻接矩阵表示,这使得它很方便地循环(i,j,k)索引。有没有一种方法可以在邻接列表表示中实现这一点?我看到,即使是这个网站在应用算法之前,c++,algorithm,graph,C++,Algorithm,Graph,基于邻接表的Floyd-Warshall算法 < P>我使用C++中的邻接矩阵实现了弗洛依德WARWEDE算法,但我使用邻接矩阵表示,这使得它很方便地循环(i,j,k)索引。有没有一种方法可以在邻接列表表示中实现这一点?我看到,即使是这个网站在应用算法之前也会将邻接列表转换成矩阵 int rowSize = numberOfGraphVertices, colSize = numberOfGraphVertices ; std::vector<int> shortestPa

基于邻接表的Floyd-Warshall算法 < P>我使用C++中的邻接矩阵实现了弗洛依德WARWEDE算法,但我使用邻接矩阵表示,这使得它很方便地循环(i,j,k)索引。有没有一种方法可以在邻接列表表示中实现这一点?我看到,即使是这个网站在应用算法之前也会将邻接列表转换成矩阵

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());
int rowSize=numberofgraphvities,colSize=numberofgraphvities;
std::向量最短路径矩阵(rowSize*colSize,10000000);
对于(inti=0;i是的,有一种方法。你真正的问题是什么?为什么要使用邻接列表,而不是邻接矩阵?只是为了节省内存,但我想所有对的最短路径都意味着,我们无论如何都必须使用内存,对吗?是的,无论如何都必须为解表分配O(V^2)。直接从邻接列表中执行此操作不会节省任何内存。实际上,结果需要存储O(V^2)内存。因此,您可以将相同的邻接矩阵用于这两个目的