码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 最短Hamilton路径( 二进制 + 状态压缩dp)


    给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1 的最短 Hamilton 路径。

    Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。

    输入格式

    第一行输入整数 n。

    接下来 n 行每行 n 个整数,其中第 i 行第 j 个整数表示点 i 到 j 的距离(记为 a[i,j])。

    对于任意的 x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x] 并且 a[x,y]+a[y,z]≥a[x,z]。

    输出格式

    输出一个整数,表示最短 Hamilton 路径的长度。

    数据范围

    1≤n≤20
    0≤a[i,j]≤107

    输入样例:

    1. 5
    2. 0 2 4 5 1
    3. 2 0 6 5 3
    4. 4 6 0 8 3
    5. 5 5 8 0 5
    6. 1 3 3 5 0

    输出样例:

    18

      

    DP分析:

    用二进制来表示要走的所以情况的路径,这里用i来代替
    例如走0,1,2,4这三个点,则表示为:10111;
    走0,2,3这三个点:1101;
    状态表示:f[i][j];
    集合:所有从0走到j,走过的所有点的情况是i的所有路径
    属性:MIN
    状态计算:如1中分析一致,0–>·····–>k–>j中k的所有情况

    状态转移方程:f[i][j]=min(f[i][j],f[i-(1<



    这个解析和课上的一样%%%%

    《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp_阿正的梦工坊的博客-CSDN博客

    1. #include
    2. using namespace std;
    3. const int N = 21, M = 1 << N;
    4. int n, m;
    5. int f[M][N], weight[N][M]; // weight表示的是无权图
    6. int main(){
    7. cin >> n;
    8. for(int i = 0; i < n; i ++ )
    9. for(int j = 0; j < n; j ++ )
    10. cin >> weight[i][j];
    11. memset(f, 0x3f, sizeof f);
    12. f[1][0] = 0; // 0是起点
    13. for(int i = 0; i < (1 << n); i ++ ){ // i表示所有情况
    14. for(int j = 0; j < n; j ++ ){ // j表示走到哪一个点
    15. if(i >> j & 1){
    16. for(int k = 0; k < n; k ++ ){ // k表示走到j这个点之前,以k为终点的最短距离
    17. if(i >> k & 1){
    18. f[i][j] = min(f[i][j], f[i - (1 << j)][k] + weight[k][j]);
    19. }
    20. }
    21. }
    22. }
    23. }
    24. cout << f[(1 << n) - 1][n - 1] << endl; // 终点是 n-1 的最短距离
    25. // 位运算的优先级低于‘+’‘-’, 所以在需要的情况要加括号
    26. return 0;
    27. }

  • 相关阅读:
    el-table的border属性失效问题解决方案
    gRPC之.Net6中的客户端和服务端共用proto协议文件
    光伏电子工程的设计与实施2022——单片机力控部分实现思路
    dubbo命令行
    C. Joyboard
    概率论介绍
    【Android】Handler为什么会造成内存泄漏
    Java-随机数据生成器(造数据)
    ROS中的坐标变换
    三维模型3DTile格式轻量化压缩处理工具常用几款软件介绍
  • 原文地址:https://blog.csdn.net/weixin_63914060/article/details/126128478
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号