您的位置:首页 > 其它

UVa 116 - Unidirectional TSP

2013-06-12 16:33 465 查看
/*
DP : 从右往左递推,方便字典序打印。
*/
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXM = 15;
const int MAXN = 105;
int m, n;
int A[MAXM][MAXN];
int d[MAXN][MAXM];
int s[MAXN][MAXM];

void print(int i, int j)
{
if(i==n)  {printf("%d", j); return;}
printf("%d ", j);
print(i+1, s[i][j]);
}

void dp()
{
for(int i=1; i<=m; i++) {
d
[i] = A[i]
;
}
for(int i=n-1; i>=1; i--) {
for(int j=1; j<=m; j++) {
int &cur = d[i][j];
int &idx = s[i][j];
cur = d[i+1][j];
idx = j;
int row = (j+m-2)%m + 1;
int temp = d[i+1][row];
if(temp < cur || (temp == cur && row < idx)) {
cur = temp;
idx = row;
}
row = j%m + 1;
temp = d[i+1][row];
if(temp < cur || (temp == cur && row < idx)) {
cur = temp;
idx = row;
}
cur += A[j][i];
}
}
}

int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
while(scanf("%d%d", &m, &n) == 2) {
for(int i=1; i<=m; i++) {
for(int j=1; j<=n; j++) {
scanf("%d", &A[i][j]);
}
}
dp();
int val = d[1][1];
int idx = 1;
for(int i=2; i<=m; i++) {
if(d[1][i] < val) {
val = d[1][i];
idx = i;
}
}
print(1, idx);
printf("\n%d\n", val);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: