UVA 116 单向TSP

对于可变行的排序不太好想,学到了新的排序思路,这题用逆推比较容易记录每列的行序号。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;

int g[105][105];
int d[105][105];
int next1[105][105];
int ans;
int first;
void dp(int r,int c ){
  ans=inf,first=0;
    for (int j=c-1;j>=0;j--) {
        for (int i=0;i<r;i++) {
            if (j==c-1) d[i][j]=g[i][j];
            else {
                int row[3]={i,i-1,i+1};
                if (i==0) row[1]=r-1;/
                if (i==r-1) row[2]=0;
                sort (row,row+3);
                d[i][j]=inf;
                for (int k=0;k<3;k++) {
                    int v=d[row[k]][j+1]+g[i][j];
                    if (v<d[i][j]) { d[i][j]=v;next1[i][j]=row[k];}
                }
            }
            if (j==0&&ans>d[i][j]) { ans=d[i][j];first=i;}
        }
    }
}

int main(){
int i,j,a,b;
int kase=1;
while(~scanf("%d %d",&a,&b))
{
	ans=inf;
	first=0;

	memset(next1,-1,sizeof(next1));
	for(int i=0;i<a;i++)
	for(int j=0;j<b;j++)
	{
		int k;
		scanf("%d",&k);
		g[i][j]=k;
	
	}
	
	dp(a,b);
	printf("%d",first+1);
	for(int i=next1[first][0],j=1;j<b;i=next1[i][j],j++)
	printf(" %d",i+1);
	printf("\n%d\n",ans);
	
		
}



}
发布了57 篇原创文章 · 获赞 58 · 访问量 666

猜你喜欢

转载自blog.csdn.net/weixin_43568895/article/details/103347366
116