diff --git a/cs677/hw7/src/floyd.cc b/cs677/hw7/src/floyd.cc index f54d743..04dcde5 100644 --- a/cs677/hw7/src/floyd.cc +++ b/cs677/hw7/src/floyd.cc @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -35,13 +36,36 @@ int main(int argc, char * argv[]) int D[2][num_verts][num_verts]; convertToMatrix(v, num_verts, (int *) &D[0]); + /* Run Floyd's Algorithm on D */ + for (int k = 1; k <= num_verts; k++) + { + for (int i = 0; i < num_verts; i++) + { + for (int j = 0; j < num_verts; j++) + { + int distWithoutK = D[(k-1) & 1][i][j]; + int distItoK = D[(k-1) & 1][i][k-1]; + int distKtoJ = D[(k-1) & 1][k-1][j]; + int distWithK = + (distItoK == INT_MAX || distKtoJ == INT_MAX) + ? INT_MAX + : distItoK + distKtoJ; + D[k & 1][i][j] = min( + distWithoutK, + distWithK + ); + } + } + } + + /* Print out the final matrix */ for (int i = 0; i < num_verts; i++) { for (int j = 0; j < num_verts; j++) { - cout << D[0][i][j] << " "; + printf("%2d ", D[num_verts & 1][i][j]); } - cout << endl; + printf("\n"); } return 0; @@ -77,6 +101,8 @@ void convertToMatrix(const vector & v, int num_verts, int * vals) for (int j = 0; j < num_verts; j++) { (*V)[i][j] = v[vidx++]; + if ((*V)[i][j] == 0) + (*V)[i][j] = INT_MAX; } } }