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;
}