00116 - Unidirectional TSP Solution Code:
(Gilbert Lee)
#include <stdio.h>
int M[10][100], min[10][100], path[10][100];
int m,n, finalnode;
int minvalue(int col){
int i, finalmin;
finalmin = min[0][col];
finalnode = 0;
for(i = 0; i < m; i++){
if(min[i][col] < finalmin){
finalnode = i;
finalmin = min[i][col];
}
}
return finalmin;
}
void printpath(int col, int row){
if(col == 0){
printf("%d", row+1);
} else {
printpath(col-1, path[row][col]);
printf(" %d",row+1);
};
}
int FindMin(){
int i, j, north,east,south, np, ep, sp;
for(i = 0; i < m; i++){
path[i][0] = 0;
min[i][0] = M[i][0];
};
if(n > 0){
for(j = 1; j < n; j++){
for(i = 0; i < m; i++){
np = (i+m-1)%m;
ep = i;
sp = (i+1)%m;
north = min[np][j-1];
east = min[ep][j-1];
south = min[sp][j-1];
if(north <= east && north <= south){
min[i][j] = north + M[i][j];
path[i][j] = np;
if( (north == east) && ( ep < path[i][j])) path[i][j] = ep;
if( (north == south) && ( sp < path[i][j])) path[i][j] = sp;
} else if(east <= north && east <= south){
min[i][j] = east + M[i][j];
path[i][j] = ep;
if( (east == north) && ( np < path[i][j])) path[i][j] = np;
if( (east == south) && ( sp < path[i][j])) path[i][j] = sp;
} else if(south <= north && south <= east){
min[i][j] = south + M[i][j];
path[i][j] = sp;
if( (south == north) && ( np < path[i][j])) path[i][j] = np;
if( (south == east) && ( ep < path[i][j])) path[i][j] = ep;
};
};
};
};
return minvalue(n-1);
}
int main(){
int i, j, fmin;
while(scanf("%d %d", &m, &n)==2){
for(i = 0; i < m; i++)
for(j = 0; j < n; j++)
scanf("%d", &M[i][j]);
fmin = FindMin();
printpath(n-1, finalnode);
printf("\n");
printf("%d\n", fmin);
}
return 0;
}