描述:实际就是从这个数组找最小,状态方程是:s[i][j]+=min(min(s[a][j+1],s[b][j+1]),s[c][j+1]);但是难得不是这,而是寻找一条路径满足行坐标尽量的小,只能从右往左找了
#include <cstdio>
#include <cstring>
int min(int a,int b)
{
if(a>b) return b;
else return a;
}
int main()
{
//freopen("a.txt","r",stdin);
int n,m;
int num[15][105],s[15][105];
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(num,-1,sizeof(num));
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++) scanf("%d",&s[i][j]);
for(int j=m-1; j>=1; j--)
for(int i=1; i<=n; i++)
{
int b=i,a,c,d,e=-1;
if(i>=2) a=i-1;
else a=n;
if(i<n) c=i+1;
else c=1;
d=min(min(s[a][j+1],s[b][j+1]),s[c][j+1]);
s[i][j]+=d;
if(d==s[a][j+1]) e=a;
if(d==s[b][j+1]&&(e==-1||(e!=-1&&b<e))) e=b;
if(d==s[c][j+1]&&(e==-1||(e!=-1&&c<e))) e=c;
num[i][j]=e;
}
int sum=100000000,flag=0;
for(int i=1; i<=n; i++)
if(s[i][1]<sum)
{
sum=s[i][1];
flag=i;
}
printf("%d",flag);
flag=num[flag][1];
for(int i=2; i<=m&&flag!=-1; i++)
{
printf(" %d",flag);
flag=num[flag][i];
}
printf("\n%d\n",sum);
}
return 0;
}
116 - Unidirectional TSP
最新推荐文章于 2020-10-14 19:38:17 发布