java解法

使用动态规划结合状态压缩来解决问题。
定义 dp[u][mask] 表示当前在点
𝑢
u,访问过的点集合为 mask 时的最短路径长度。
通过逐步扩展访问点的集合,从只访问起点
0
0 开始,逐步扩展到访问所有点。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        // 输入点的数量
        int n = sc.nextInt();
        
        // 输入距离矩阵
        int[][] dist = new int[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                dist[i][j] = sc.nextInt();
            }
        }
        
        // 计算并输出最短路径
        System.out.println(tsp(dist, n));
    }

    /**
     * 使用动态规划求解 TSP 问题
     *
     * @param dist 距离矩阵
     * @param n    点的数量
     * @return     最短路径长度
     */
    public static int tsp(int[][] dist, int n) {
        // dp[u][mask]:当前在点 u,访问的点集合为 mask 时的最短路径长度
        int[][] dp = new int[n][1 << n];
        
        // 初始化 dp 表,所有值设置为无穷大
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < (1 << n); j++) {
                dp[i][j] = Integer.MAX_VALUE / 2; // 避免加法溢出
            }
        }
        
        // 初始状态:从点 0 出发,只访问点 0
        dp[0][1] = 0;

        // 枚举所有状态 mask
        for (int mask = 1; mask < (1 << n); mask++) {
            // 枚举当前点 u
            for (int u = 0; u < n; u++) {
                // 如果点 u 不在当前的点集合中,跳过
                if ((mask & (1 << u)) != 0) {
                    // 枚举下一个点 v
                    for (int v = 0; v < n; v++) {
                        // 如果点 v 已经访问过,跳过
                        if ((mask & (1 << v)) == 0) {
                            // 更新 dp[v][newMask]
                            dp[v][mask | (1 << v)] = Math.min(
                                dp[v][mask | (1 << v)], 
                                dp[u][mask] + dist[u][v]
                            );
                        }
                    }
                }
            }
        }

        // 计算结果:从终点返回起点的最短路径
        int result = Integer.MAX_VALUE;
        for (int i = 1; i < n; i++) {
            result = Math.min(result, dp[i][(1 << n) - 1] + dist[i][0]);
        }
        return result;
    }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C++解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/145064146"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!