// UVa 116 - Unidirectional TSP // Dynamic Programming // O(m*n) #include <stdio.h> #include <algorithm> using namespace std; const int maxm = 102; const int maxn = 102; typedef signed long long int ll; ll A[maxm][maxn], T[maxm][maxn]; int R[maxm][maxn]; int main() { int n, m; while (scanf("%d%d", &m, &n) != EOF) { // input for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) scanf("%lld", &A[i][j]); // base cases for (int i = 0; i < m; i++) T[i][n - 1] = A[i][n - 1]; // DP for (int j = n - 2; j >= 0; j--) for (int i = 0; i < m; i++) { int up = i > 0 ? i - 1 : m - 1; int mid = i; int down = i < m - 1 ? i + 1 : 0; int a = min(up, min(mid, down)); int c = max(up, max(mid, down)); int b = up + mid + down - a - c; if (T[a][j + 1] <= T[b][j + 1] && T[a][j + 1] <= T[c][j + 1]) { R[i][j] = a; T[i][j] = T[a][j + 1] + A[i][j]; } else if (T[b][j + 1] <= T[c][j + 1]) { R[i][j] = b; T[i][j] = T[b][j + 1] + A[i][j]; } else { R[i][j] = c; T[i][j] = T[c][j + 1] + A[i][j]; } } // select minimum solution int sol[maxn]; sol[0] = 0; for (int i = 1; i < m; i++) if (T[i][0] < T[sol[0]][0]) sol[0] = i; // output for (int j = 1; j < n; j++) sol[j] = R[sol[j - 1]][j - 1]; for (int j = 0; j < n - 1; j++) printf("%d ", sol[j] + 1); printf("%d\n", sol[n - 1] + 1); printf("%lld\n", T[sol[0]][0]); } return 0; }
Monday, May 4, 2015
UVa 116 - Unidirectional TSP
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment