题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001

题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上,要求经过所有城市并且花费最少,求出最小花费。

解题思路:三进制的状态压缩DP,跟二进制还是有一点不一样的,因为三进制没有直接的位运算,还要自己先做处理利用num[i][j]记录数字i各位的三进制表示方便计算,其他的就跟二进制状态压缩没有太大区别了。还有注意:

     ①开始要将n个起点初始化,dp[bit[i]][i]=0

     ②有重边,要去重

代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<queue>
  5. #include<cstring>
  6. using namespace std;
  7. const int INF=0x3f3f3f3f;
  8. const int N=6e4+;
  9.  
  10. int n,m,ans;
  11. int map[][];
  12. int dp[N][];
  13. int bit[]={,,,,,,,,,,};
  14. int num[N][];
  15.  
  16. //计算所有数字10位以内三进制表示
  17. void make_tab(){
  18. for(int i=;i<bit[];i++){
  19. int b=i;
  20. for(int j=;j<;j++){
  21. num[i][j]=b%;
  22. b/=;
  23. }
  24. }
  25. }
  26.  
  27. int main(){
  28. make_tab();
  29. while(~scanf("%d%d",&n,&m)){
  30. memset(map,0x3f,sizeof(map));
  31. memset(dp,0x3f,sizeof(dp));
  32. int ans=INF;
  33. for(int i=;i<=m;i++){
  34. int a,b,c;
  35. scanf("%d%d%d",&a,&b,&c);
  36. a--,b--;
  37. //去重边
  38. map[a][b]=min(map[a][b],c);
  39. map[b][a]=min(map[b][a],c);
  40. }
  41. for(int i=;i<n;i++)
  42. dp[bit[i]][i]=;//对每个点定位初始点0
  43.  
  44. for(int i=;i<bit[n];i++){
  45. bool flag=true;//表示所有位都是>=1,也就是每个城镇都走过了
  46. for(int j=;j<n;j++){
  47. if(num[i][j]==)
  48. flag=false;
  49. if(dp[i][j]==INF)//判断是否走到j点
  50. continue;
  51. for(int k=;k<n;k++){
  52. //注意这个num[i][k]>=2,因为如果i状态在k点已经走过两次了显然是不能继续往下走的
  53. if(j==k||num[i][k]>=||map[j][k]==INF)
  54. continue;
  55. int next=i+bit[k];//从j点走到k点
  56. dp[next][k]=min(dp[next][k],dp[i][j]+map[j][k]);
  57. }
  58. }
  59. //如果所有城镇都走了一遍则可以找出最小值
  60. if(flag){
  61. for(int j=;j<n;j++)
  62. ans=min(ans,dp[i][j]);
  63. }
  64. }
  65. if(ans==INF)
  66. puts("-1");
  67. else
  68. printf("%d\n",ans);
  69. }
  70. return ;
  71. }

HDU 3001 Travelling(状态压缩DP+三进制)的更多相关文章

  1. HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二

    终于刷完搜索专题了. 题意:给定n个城市,每个城市参观不能超过两次,两个城市之间有道路通过需要花费X,求通过能所有城市的最小花费. 思路:每个城市有三个状态0,1,2,可用三进制存储所有城市的访问状态 ...

  2. HDU 3001【状态压缩DP】

    题意: 给n个点m条无向边. 要求每个点最多走两次,要访问所有的点给出要求路线中边的权值总和最小. 思路: 三进制状态压缩DP,0代表走了0次,1,2类推. 第一次弄三进制状态压缩DP,感觉重点是对数 ...

  3. HDU 3001(状态压缩dp)

    状态压缩dp的第一题! 题意:Mr ACMer想要进行一次旅行,他决定访问n座城市.Mr ACMer 可以从任意城市出发,必须访问所有的城市至少一次,并且任何一个城市访问的次数不能超过2次.n座城市间 ...

  4. hdu 3001 Travelling(状态压缩 三进制)

    Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. hdu 5094 Maze 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...

  6. hdu 4856 Tunnels 状态压缩dp

    Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem ...

  7. Hdu 3001 Travelling 状态DP

    题目大意 一次旅游,经过所有城市至少一次,并且任何一座城市访问的次数不能超过两次,求最小费用 每个城市最多访问两次,用状态0,1,2标识访问次数 把城市1~N的状态按照次序连接在一起,就组成了一个三进 ...

  8. HDU 3001 Travelling (状压DP + BFS)

    题意:有一个人要去旅游,他想要逛遍所有的城市,但是同一个城市又不想逛超过2次.现在给出城市之间的来往路费,他可以选择任意一个点为起点. 问逛遍所有城市的最低路费是多少. 析:用三进制表示每个城市的访问 ...

  9. HDU 3001 Travelling ——状压DP

    [题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #in ...

随机推荐

  1. (转)MS14-068域内提权漏洞总结

    0x01 漏洞起源 说到ms14-068,不得不说silver ticket,也就是银票.银票是一张tgs,也就是一张服务票据.服务票据是客户端直接发送给服务器,并请求服务资源的.如果服务器没有向域控 ...

  2. 51nod1967 路径定向(欧拉回路+结论题)

    看到入度等于出度想到欧拉回路. 我们把边都变成无向边,有一个结论是偶数度的点都可以变成出入度相等的点,而奇数点的不行,感性理解分类讨论一下就知道是对的. 还有一个更好理解的结论是变成无向边后奇数点的个 ...

  3. Codeforces Round #301 (Div. 2)A B C D 水 模拟 bfs 概率dp

    A. Combination Lock time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  4. Linux系统之路——如何在CentOS7.2安装R和RStudio(Server)

    使用ubuntu的小伙伴们直接使用命令sudo apt-get install r-base-dev或者r-base搞定.然而对于使用centos的我却一直卡在安装这一步,十分的悲催,只有羡慕的份,但 ...

  5. Codeforces 864E dp

    题意: 房间着火了,里面有n件物品,每件物品有营救需要的时间t,被烧坏的最晚时间d,他的价值p,问能得到的最大价值,并且输出营救出来的物品编号 代码: //必然是先救存活时间短的即d小的,所以先排个序 ...

  6. echo 不换行

    原文 http://blog.sina.com.cn/s/blog_4da051a6010184uk.html echo -n 不换行输出   $echo -n "123" $ec ...

  7. ZOJ 3778 C - Talented Chef 水题

    LINK:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3778 题意:有n道菜,每道菜需要\(a_i\)道工序,有m个锅可 ...

  8. MySQL的连接类型

    首先我们来创建两个数据表: 结构: 我们用内连接来查看一下: select *  from test1 join  test2 on test1.aid=test2.aid; 由于内连接是等值连接,所 ...

  9. HDFS默认副本数为什么是3

    转载自: https://www.cnblogs.com/bugchecker/p/why_three_replications_for_HDFS_in_engineer.html HDFS采用一种称 ...

  10. Cloudera 安装

    参考网址: http://tcxiang.iteye.com/blog/2087597 http://archive.cloudera.com/cdh5/ http://archive.clouder ...