HDU3001 Travelling (状压DP)
题目没有起点限制,且每个节点至少访问1次,最多访问2次,所以用三进制数表示节点的状态(选取情况)。
因为三进制数的每一位是0或1或2,所以预处理z状态S的第j位的数是有必要的。
边界条件:dp[tri[i]][i]=0,表示只访问了i节点时,从i出发最小费用是0。
最后的答案就在所有满足条件的状态中统计dp[S][u]的最小值,枚举u(因为无起点限制)。
1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 const int INF=0x3f3f3f3f;
5 using namespace std;
6 int n,m,ans;
7 int tri[12]={0,1,3,9,27,81,243,729,2187,6561,19683,59049};//三进制每位为1时对应十进制,如第3位是1,(100)3=9
8 int dig[60000][11];//dig[S][j]状态S的第j位是多少
9 int edge[11][11],dp[60000][11];//3^10=59050
10
11 void init(){
12 for(int i=0;i<59050;i++){
13 int t=i;
14 for(int j=1;j<=10;j++){
15 dig[i][j]=t%3;
16 t/=3;
17 if(t==0) break;
18 }
19 }
20 }
21
22 void solve(){
23 memset(dp,0x3f,sizeof(dp));
24 for(int i=1;i<=n;i++) dp[tri[i]][i]=0;//初始化状态为tri[i]时,从i出发最小费用为0
25 ans=INF;
26 for(int S=0;S<tri[n+1];S++){//状态顺序枚举
27 bool visit_all=1;//标记所有的城市都遍历1次以上
28 for(int u=1;u<=n;u++){
29 if(dig[S][u]==0){
30 visit_all=0;
31 continue;
32 }
33 for(int v=1;v<=n;v++){
34 if(dig[S][v]==0) continue;
35 dp[S][u]=min(dp[S][u],dp[S-tri[u]][v]+edge[u][v]);
36 //有u的集合可以由不含u的集合通过v-u这条边转移而来
37 }
38 }
39 if(visit_all){
40 for(int u=1;u<=n;u++)
41 ans=min(ans,dp[S][u]);//无起点限制,对于满足条件的状态枚举从每个节点出发取最小值
42 }
43 }
44 }
45
46 int main(){
47 init();
48 while(~scanf("%d%d",&n,&m)){
49 memset(edge,0x3f,sizeof(edge));
50 int a,b,c;
51 while(m--){
52 scanf("%d%d%d",&a,&b,&c);
53 edge[a][b]=edge[b][a]=min(edge[a][b],c);
54 }
55 solve();
56 if(ans==INF) ans=-1;
57 printf("%d\n",ans);
58 }
59 return 0;
60 }
HDU3001 Travelling (状压DP)的更多相关文章
- HDU3001 Travelling 状压DP
哭瞎啊,每一个城市能够经过至多两次,但没有要求必须经过两次.想用 两个状压来乱搞搞.结果自觉得会T.结果 WA了,搞了一下午.没想到用三进制啊.智商捉急,參考了 http://blog.csdn.ne ...
- HDU3001 Travelling —— 状压DP(三进制)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/ ...
- HDU 3001 Travelling ——状压DP
[题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #in ...
- hdu3001(状压dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题意:n 个城市已经 m 条路 以及对应路费 c,要求遍历所有城市最少的路费,每个城市不能超过2 ...
- hdu3001(状压dp,三进制)
Travelling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二
终于刷完搜索专题了. 题意:给定n个城市,每个城市参观不能超过两次,两个城市之间有道路通过需要花费X,求通过能所有城市的最小花费. 思路:每个城市有三个状态0,1,2,可用三进制存储所有城市的访问状态 ...
- HDU 3001 Travelling (状压DP + BFS)
题意:有一个人要去旅游,他想要逛遍所有的城市,但是同一个城市又不想逛超过2次.现在给出城市之间的来往路费,他可以选择任意一个点为起点. 问逛遍所有城市的最低路费是多少. 析:用三进制表示每个城市的访问 ...
- Travelling(HDU3001+状压dp+三进制+最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目: 题意:n个城市,m条边,每条边都有一个权值,问你经过所有的城市且每条边通过次数不超过两次 ...
- hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp
题目链接 题意 给定一个\(N\)个点的无向图,求从任意一个点出发,经过所有点的最短路径长度(每个点至多可以经过两次). 思路 状态表示.转移及大体思路 与 poj 3311 Hie with the ...
- HDU 3001 Travelling (状压DP,3进制)
题意: 给出n<=10个点,有m条边的无向图.问:可以从任意点出发,至多经过同一个点2次,遍历所有点的最小费用? 思路: 本题就是要卡你的内存,由于至多可经过同一个点2次,所以只能用3进制来表示 ...
随机推荐
- rust实现http时如何读取一个完整的request
用stream.read_to_end是不行的,tcpstream不是文件没有明确的结束符 需要先读取http header节,再找Content-Length header,然后读取body. 这是 ...
- oracle删除超过N天数据脚本
公司内做的项目是工厂内的,一般工厂内数据要求的是实时性,很久之前的数据可以自行删除处理,我们数据库用的oracle,所以就想着写一个脚本来删除,这样的话,脚本不管放在那里使用都可以达到效果 由于服务器 ...
- Vue3:不常用的Composition API && Fragment、Teleport、Suspense && 与Vue2对比的一些变化
1 # 一.Vue3不常用的Composition API 2 # 1.shallowReactive与shallowRef 3 .shallowReactive: 只处理对象最外层属性的响应式(浅响 ...
- 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知
面试官: 我看你的简历上写着精通MySQL,问你个简单的问题,MySQL联合索引有什么特性? 心想,这还不简单,这不是问到我手心里了吗? 听我给你背一遍八股文! 我: MySQL联合索引遵循最左前缀匹 ...
- Luogu3855 [TJOI2008]Binary Land (BFS)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- Http 前端向后端传递List参数
场景 在日常项目开发中,前端向后端传参时,可能会遇到需要传 List 类型的参数.比如批量删除时将多个 ID 以集合的形式传给后台. 前端传参 此时前端传参有两种方式: 1.多个同名 key key ...
- 搞定面试官 - 你可以介绍一下在 MySQL 中,哪些情况下 索引会失效嘛?
大家好,我是程序员啊粥,前边给大家分享了 *MySQL InnoDB 索引模型 在 MySQL InnoDB 中,为什么 delete 删除数据之后表数据文件大小没有变 如何计算一个索引的长度 如何查 ...
- java-前端之HTML
--html网页简单使用 1.html网页的基本标签 <!doctype html><!-- 声明网页版本 --> <html><!-- 唯一的跟元素 --& ...
- rcu使用遇到问题汇总
1.3.10内核,在项目中遇到一种情况,我们根据sk指针hash到一个cpu上,然后访问该cpu对应分配的一个数据区. 然后系统会偶尔crash掉,crash掉有两种情况,一种是cred的rcu回收时 ...
- SiteSucker Pro for Mac 专业的网站下载工具
SiteSucker Mac版是Mac os平台上的一款帮助用户下载数据的mac下载工具,SiteSucker绝对是一扒网站的利器,不仅仅是下载网站的HTML源文件,他连网站整体架构以及下面的所有文本 ...