http://acm.hdu.edu.cn/showproblem.php?pid=3001

Travelling

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

Total Submission(s): 3864    Accepted Submission(s): 1217
Problem Description
After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best choice!He has decided to visit n cities(he insists on seeing all the cities!And he does not mind which city being his start station because superman
can bring him to any city at first but only once.), and of course there are m roads here,following a fee as usual.But Mr Acmer gets bored so easily that he doesn't want to visit a city more than twice!And he is so mean that he wants to minimize the total fee!He
is lazy you see.So he turns to you for help.
 
Input
There are several test cases,the first line is two intergers n(1<=n<=10) and m,which means he needs to visit n cities and there are m roads he can choose,then m lines follow,each line will include three intergers a,b and c(1<=a,b<=n),means
there is a road between a and b and the cost is of course c.Input to the End Of File.
 
Output
Output the minimum fee that he should pay,or -1 if he can't find such a route.
 
Sample Input
  1. 2 1
  2. 1 2 100
  3. 3 2
  4. 1 2 40
  5. 2 3 50
  6. 3 3
  7. 1 2 3
  8. 1 3 4
  9. 2 3 10
 
Sample Output
  1. 100
  2. 90
  3. 7

题意:给出一个无向图,并给出路径及费用,问旅行完所有的节点需要的花费最少是多少(可以从任意一点出发,每个节点经过的次数不超过2次)

分析:对于只经过节点仅且一次的题目,很清楚用二进制dp,暴搜完所有的状态,而此题每个节点有三个状态,即没走过,走了一次,走了两次,所以用三进制表示,分别代表三种状态;用dp[i][j]表示经过节点j后到达状态i;当i状态满足所有位置没有0是,即每个点都至少经过了一次,就是一种情况,但不一定是最优情况所以要更新最小值;

程序:

  1. #include"stdio.h"
  2. #include"string.h"
  3. #include"iostream"
  4. #include"map"
  5. #include"string"
  6. #include"queue"
  7. #include"stdlib.h"
  8. #include"algorithm"
  9. #include"math.h"
  10. #define M 60001
  11. #define eps 1e-10
  12. #define inf 100000000
  13. #define mod 100000000
  14. #define INF 0x3f3f3f3f
  15. using namespace std;
  16. int dp[M][12],px[12],a[M][12],dis[12][12],path[M][12];
  17. void init()
  18. {
  19. int i;
  20. px[0]=1;
  21. for(i=1;i<=10;i++)
  22. px[i]=px[i-1]*3;
  23. memset(a,0,sizeof(a));
  24. for(i=0;i<px[10];i++)
  25. {
  26. int k=i,t=0;
  27. while(k)
  28. {
  29. a[i][t++]=k%3;
  30. k/=3;
  31. }
  32. }
  33. }
  34. int main()
  35. {
  36. init();
  37. int n,m,i,j,k;
  38. while(scanf("%d%d",&n,&m)!=-1)
  39. {
  40. memset(dis,INF,sizeof(dis));
  41. for(i=1;i<=m;i++)
  42. {
  43. int u,v,c;
  44. scanf("%d%d%d",&u,&v,&c);
  45. u--;
  46. v--;
  47. if(dis[u][v]>c)
  48. dis[u][v]=dis[v][u]=c;
  49. }
  50. memset(dp,INF,sizeof(dp));
  51. memset(path,-1,sizeof(path));
  52. for(i=0;i<n;i++)
  53. {
  54. dp[px[i]][i]=0;
  55. path[px[i]][i]=-1;
  56. }
  57. int ans=INF;
  58. int I,J;
  59. for(i=1;i<px[n];i++)
  60. {
  61. int flag=1;
  62. for(j=0;j<n;j++)
  63. {
  64. if(a[i][j]==0)
  65. {
  66. flag=0;continue;
  67. }
  68. int cur=i-px[j];
  69. for(k=0;k<n;k++)
  70. {
  71. if(dp[i][j]>dp[cur][k]+dis[k][j])
  72. {
  73. dp[i][j]=dp[cur][k]+dis[k][j];
  74. path[i][j]=k;
  75. }
  76.  
  77. }
  78. }
  79. if(flag)
  80. {
  81. for(j=0;j<n;j++)
  82. {
  83. if(ans>dp[i][j])
  84. {
  85. I=i;
  86. J=j;
  87. ans=dp[i][j];
  88. }
  89.  
  90. }
  91. }
  92. }
  93. /*********路径**********/
  94. /*printf("%d->",J+1);
  95. for(k=path[I][J];k!=-1;k=path[I][k])
  96. {
  97. printf("%d->",k+1);
  98. I=I-px[J];
  99. J=k;
  100. }
  101. printf("\n");*/
  102. /***********************/
  103. if(ans<INF)
  104. printf("%d\n",ans);
  105. else
  106. printf("-1\n");
  107. }
  108. return 0;
  109. }

三进制状态压缩DP(旅行商问题TSP)HDU3001的更多相关文章

  1. hdu-3001 三进制状态压缩+dp

    用dp来求最短路,虽然效率低,但是状态的概念方便解决最短路问题中的很多限制,也便于压缩以保存更多信息. 本题要求访问全图,且每个节点不能访问两次以上.所以用一个三进制数保存全图的访问状态(3^10,空 ...

  2. HDU 3001 Travelling (三进制状态压缩 DP)

    题意:有 n 个city,能够选择任一城市作为起点,每一个城市不能訪问超过2次, 城市之间有权值,问訪问所有n个城市须要的最小权值. 思路:由于每一个城市能够訪问最多两次,所以用三进制表示訪问的状态. ...

  3. HDOJ-3001(TSP+三进制状态压缩)

    Traving HDOJ-3001 这题考察的是状态压缩dp和tsp问题的改编 需要和传统tsp问题区分的事,这题每个点最多可以经过两次故状态有3种:0,1,2 这里可以模仿tsp问题的二进制压缩方法 ...

  4. BZOJ4479 [JSOI2013] 吃货jyy 解题报告(三进制状态压缩+欧拉回路)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4479 Description [故事背景]作为JSOI的著名吃货,JYY的理想之一就是吃 ...

  5. hdu4064 三进制状态压缩 好题!

    还不太会做这类题,总之感觉有点难啊. 用深搜代替打表求出一行所有的可行状态,注意要进行剪枝 这是自己理解的代码,但是tle了 #include<bits/stdc++.h> using n ...

  6. 最短路+状态压缩dp(旅行商问题)hdu-4568-Hunter

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 题目大意: 给一个矩阵 n*m (n m<=200),方格里如果是0~9表示通过它时要花 ...

  7. poj 2688 状态压缩dp解tsp

    题意: 裸的tsp. 分析: 用bfs求出随意两点之间的距离后能够暴搜也能够用next_permutation水,但效率肯定不如状压dp.dp[s][u]表示从0出发訪问过s集合中的点.眼下在点u走过 ...

  8. HDU 3001【状态压缩DP】

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

  9. HDU 3001 Travelling(状态压缩DP+三进制)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...

随机推荐

  1. JS三大经典变量命名法

    匈牙利命名法: 通过在变量名前面添加相应小写字母的符号标示作为前缀,标示出变量的作用域,类型等,前缀后面是一个或多个单词组合,单词描述了变量的用途,如i表示的是整数,s表示的是字符串.示例: var ...

  2. 总结一发linux常用命令

    显示目录和文件的命令 Ls:用于查看所有文件夹的命令. Dir:用于显示指定文件夹和目录的命令   Tree: 以树状图列出目录内容 Du:显示目录或文件大小 修改目录,文件权限和属主及数组命令 Ch ...

  3. Ubuntu telnet

    首先在Ubuntu中安装xinetd(它是inetd替代品): sudo apt-get install xinetd 再安装telnetd,在Ubuntu中没有telnetd这个软件包,它是包含在i ...

  4. 转载:【原译】Erlang列表处理(Efficiency Guide)

    转自:http://www.cnblogs.com/futuredo/archive/2012/10/22/2734186.html List handling 1  Creating a list ...

  5. openal 基础知识3

    四创新科技extension (Creative Labs'Extensions) 创新科技为OpenAL添加了多个extensions,许多都利用了他们声卡的特性. “Enumerate All”e ...

  6. Linux下的shell编程入门

    通常情况下,我们从命令行输入命令每输入一次就能够得到系统的一次响应.一旦需要我们一个接着一个的输入命令而最后才得到结果的时候,这样的做法显然就没有效率.要达到这样的目的,通常我们利用shell程序或者 ...

  7. mybatis由浅入深day02_6延迟加载_延迟加载总结

    6 延迟加载 6.1 什么是延迟加载 需要查询关联信息时,使用mybatis延迟加载特性可有效的减少数据库压力,首次查询只查询主要信息,关联信息等用户获取时再加载. resultMap可以实现高级映射 ...

  8. day26<网络编程>

    网络编程(网络编程概述) 网络编程(网络编程三要素之IP概述) 网络编程(网络编程三要素之端口号概述) 网络编程(网络编程三要素协议) 网络编程(Socket通信原理图解) 网络编程(UDP传输) 网 ...

  9. day01<计算机基础知识&Java语言基础>

    计算机基础知识(计算机概述) 计算机基础知识(软件开发和计算机语言概述) 计算机基础知识(人机交互) 计算机基础知识(键盘功能键和快捷键) 计算机基础知识(如何打开DOS控制台) 计算机基础知识(常见 ...

  10. ArcGIS Server密码丢失

    http://jingyan.baidu.com/article/1e5468f90f6465484961b70d.html 1.cd D:\Program Files\ArcGIS\Server\t ...