单向TSP

给出一个m行n列(m≤10,n≤100)的整数矩阵,从第一列任意一个位置出发,每次可以往右、右上或右下走一格,最终到达最后一列。

要求经过整数之和最小。矩阵是环形的,即最后一行向下是第一行。输出路径上每列的行号。多解时,输出字典序最小的。

下图是两个矩阵的最优路线

 

Sample Input

5 6

3 4 1 2 8 6

6 1 8 2 7 4

5 9 3 9 9 5

8 4 1 3 2 6

3 7 2 8 6 4

5 6

3 4 1 2 8 6

6 1 8 2 7 4

5 9 3 9 9 5

8 4 1 3 2 6

3 7 2 1 2 3

2 2

9 10 9 10

Sample Output

1 2 3 4 4 5

16

1 2 1 5 4 5

11

1 1

19

 

转移方程很简单,设d(i,j)为从格子(i,j)出发到最后一列的最小开销。则:

                d(i,j)=d(i,j)+min{d(i-1,j-1),d(i,j-1),d(i+1,j-1)}

主要问题在于输出路径。这就需要在计算d(i,j)时记录 " 下一列的行号 " 的最小值。

 

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long

const int maxx=10000;
int G[maxx][maxx];
int dp[maxx][maxx];
int n,m,ar[3];

int compare_min(int a,int b,int c){
    ar[0]=a,ar[1]=b,ar[2]=c;
    sort(ar,ar+3);
    return ar[0];
}

int main() {
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>G[i][j];
    for(int j=0,i=1;i<=n;i++)
        dp[i][j]=0;
    for(int j=1;j<=m;j++)
        for(int i=1; i<=n; i++) {
            if(i==1)
                dp[i][j]=G[i][j]+compare_min(dp[n][j-1],dp[i][j-1],dp[i+1][j-1]);
            else if(i==n)
                dp[i][j]=G[i][j]+compare_min(dp[i-1][j-1],dp[i][j-1],dp[1][j-1]);
            else
                dp[i][j]=G[i][j]+compare_min(dp[i-1][j-1],dp[i][j-1],dp[i+1][j-1]);
        }
    int ans=(1<<30);
    for(int j=m,i=1;i<=n;i++)
        if(ans>dp[i][j])
            ans=dp[i][j];
    cout<<ans<<endl;
    int road[m],cns=0;
    for(int j=m;j>=1;j--) {
        for(int i=1;i<=n;i++) {
            if(dp[i][j]==ans) {
                road[cns]=i;
                break;
            }
        }
        ans=ans-G[road[cns]][j];
        cns++;
    }
    for(int i=m-1;i>=0;i--)
    cout<<road[i]<<" ";;
    cout<<endl;
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/rlddd/p/9048564.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单向TSP(Traveling Salesman Problem)算法是一种用于求解带权完全图中的最短哈密顿回路的算法。下面是该算法的设计说明书: 1. 问题描述 假设有n个城市,它们之间的距离用一个n*n的矩阵D表示。问题是在这n个城市中选择若干个城市,构成一条哈密顿回路,使回路上所有城市的总距离最小。 2. 算法思路 单向TSP算法采用的是贪心策略,即每次选择到当前点最近的未访问过的点作为下一个访问点,直到所有点都被访问过为止。具体步骤如下: - 选择一个起点,将该点标记为已访问; - 从该点开始,选择距离最近的未访问过的点作为下一个访问点,将该点标记为已访问; - 重复步骤2,直到所有点都被访问过; - 将最后一个访问点和起点相连,形成哈密顿回路。 3. 时间复杂度 单向TSP算法的时间复杂度为O(n^2),其中n为城市数。由于要遍历所有的城市,因此该算法的最好和最坏情况下的时间复杂度相同。 4. 空间复杂度 单向TSP算法的空间复杂度为O(n),其中n为城市数。主要是用于存储每个城市的状态(已访问或未访问)和哈密顿回路的路径。 5. 优缺点 单向TSP算法的优点是实现简单,可以很快得到一个近似最优解,适用于城市数较小的情况。缺点是由于采用贪心策略,并不一定得到全局最优解,而且对于城市数很大的情况,该算法的时间复杂度会变得很高,不适合使用。 6. 总结 单向TSP算法是求解旅商问题的一种简单且有效的方法,适用于城市数较小的情况。但是对于城市数很大的情况,需要使用其他更加高效的算法,如分支定界法、遗传算法等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值