UVA 116 - Unidirectional TSP

来源:互联网 发布:windows怎么ping 编辑:程序博客网 时间:2024/06/08 12:10

写的麻烦了,修改了好久,用递归写的思路不是很好,以后要优化一下,用递推再做一遍。

代码是下:

#include<stdio.h>
#include<string.h>
#define INF 0x7fffffff
int a[15][110], py[110][110][110],ans[110][110];
int m, n;
int dp(int p, int q, int x)
{
if(ans[p][q] != 16843009) return ans[p][q];
if(q == n) return a[p][q];
else if(p>=1&&p<=m&&q>=1&&q<n)
{
int t = p + 1;
int s = p - 1;
if(t > m) t = 1;
if(s < 1) s = m;
// printf("p=%d q=%d ans = %d\n",p,q,ans);
if(dp(s,q+1,x) > dp(p,q+1,x))
{
if(dp(p,q+1,x) > dp(t,q+1,x))
{ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
else if(dp(p,q+1,x) < dp(t,q+1,x))
{ans[p][q] = dp(p,q+1,x) + a[p][q];py[x][p][q] = p;}
else if(p > t)
{ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
else {ans[p][q] = dp(p,q+1,x) + a[p][q];py[x][p][q] = p;}
}
else if(dp(s,q+1,x) < dp(p,q+1,x))
{
if(dp(s,q+1,x) > dp(t,q+1,x))
{ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
else if(dp(s,q+1,x) < dp(t,q+1,x))
{ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;}
else if(s > t)
{ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
else {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;}
}
else if(dp(p,q+1,x) > dp(t,q+1,x))
{ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
else if(dp(p,q+1,x) < dp(t,q+1,x))
{
if(s > p) {ans[p][q] = dp(p,q+1,x) + a[p][q];py[x][p][q] = p;}
else {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;}
}
else if(dp(p,q+1,x) == dp(t,q+1,x))
{
if(s>p)
{
if(p>t) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
else {ans[p][q] = dp(p,q+1,x) + a[p][q];py[x][p][q] = p;}
}
else if(s<p)
{
if(t<s) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
else {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;}
}
else if(s>t) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;}
else {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;}
}
return ans[p][q];
}
}
void print(int p ,int x, int y)
{
for(; y<=n; y++)
{
if(y == n) {printf("%d\n",x); break;}
printf("%d ",x);
x = py[p][x][y];
}
}
void input()
{
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]);
int v = INF;
int flag;
for(int i = 1; i <= m; i ++)
{
memset(ans,1,sizeof(ans));
int z = dp(i,1,i);
if(v > z) {v = z; flag = i;}
// printf("v = %d flag=%d\n",v,flag);
}
print( flag, flag, 1);
printf("%d\n", v);
}
}
int main()
{
//freopen("da.out","w",stdout);
input();
return 0;
}



0 0