![]() |
|||||||||
![]() |
|||||||||
|
Floyd's All Pairs Shortest Path AlgorithmThis article was contributed by L. Shyamal. Environment: C++ (any variety) IntroductionGraph algorithms work on nodes and edges. Nodes and edges are represented in many ways. This well-known algorithm uses a connectivity matrix. The matrix is a square matrix with the number of columns and rows the same as there are Nodes. The diagonal elements are set to zero. The offdiagonals are 1 if connected and 0 if not connected. (You could also use distances if you are dealing with something like road distances.) The output of the algorithm is a matrix of the shortest distances between every pair of points. Notice that I am using a one-dimensional, linear array to represent matrices because this does not lead to any problems in memory allocation or differences across compilers. - L. Shyamal The Code// Floyd's All pairs shortest path algorithm (O (n^3) ) // input is adjacency matrix output is matrix of shortest paths // C is the adjacency matrix // n is the order of the square matrix // A is the all pairs shortest paths matrix // we assume that A is allocated by the caller int GraphAlgo::ComputeFloydAPSP(int *C, int n, int *A) { int i,j,k; // set all connected positions to 1 // and all unconnected positions to infinity for (i=0; i<n; i++) { for (j=0; j<n; j++) { if ( *(C+i*n+j) == 0) { *(A+i*n+j) = 999999999; // does this look like infinity ? } else { *(A+i*n+j) = 1; } } } // set the diagonals to zero for (i=0; i<n; i++) { *(A+i*n+i) = 0; } // for each route via k from i to j pick // any better routes and replace A[i][j] // path with sum of paths i-k and j-k for (k=0; k<n; k++) { for (i=0; i<n; i++) { for (j=0; j<n; j++) { if ( *(A+i*n+k) + *(A+k*n+j) < *(A+i*n+j) ) { // A[i][j] = A[i][k] + A[k][j]; *(A+i*n+j) = *(A+i*n+k)+ *(A+k*n+j); } } } } return 0; } // Floyd's algorithm // this is for testing Floyd's algorithm // demonstrates the allocation and // deallocation of memory for the matrices void FloydTest() { // allocate the entire matrix in one linear array // trying to allocate it as an array of pointers to arrays // didnt quite work, possibly because the [] and * notation // arent quite replaceable int n=4; int *C=new int[n*n]; C[0]=0; C[1]=1; C[2]=0; C[3]=0; C[4]=1; C[5]=0; C[6]=1, C[7]=0; C[8]=0; C[9]=1; C[10]=0;C[11]=1; C[12]=0;C[13]=0;C[14]=1;C[15]=0; int* A = new int[n*n]; ComputeFloydAPSP (C,n,A); printf("Final shortest distances\n"); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { printf("%d ",*(A+i*n+j)); } printf("\n"); } printf("End of All pairs Shortest paths\n"); delete [] A; delete [] C; } // end of FloydTest HistoryDate Posted: May 31, 2002Comments:
|
|