题目没有起点限制,且每个节点至少访问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)的更多相关文章

  1. HDU3001 Travelling 状压DP

    哭瞎啊,每一个城市能够经过至多两次,但没有要求必须经过两次.想用 两个状压来乱搞搞.结果自觉得会T.结果 WA了,搞了一下午.没想到用三进制啊.智商捉急,參考了 http://blog.csdn.ne ...

  2. HDU3001 Travelling —— 状压DP(三进制)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/ ...

  3. HDU 3001 Travelling ——状压DP

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

  4. hdu3001(状压dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题意:n 个城市已经 m 条路 以及对应路费 c,要求遍历所有城市最少的路费,每个城市不能超过2 ...

  5. hdu3001(状压dp,三进制)

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

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

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

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

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

  8. Travelling(HDU3001+状压dp+三进制+最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目: 题意:n个城市,m条边,每条边都有一个权值,问你经过所有的城市且每条边通过次数不超过两次 ...

  9. hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp

    题目链接 题意 给定一个\(N\)个点的无向图,求从任意一个点出发,经过所有点的最短路径长度(每个点至多可以经过两次). 思路 状态表示.转移及大体思路 与 poj 3311 Hie with the ...

  10. HDU 3001 Travelling (状压DP,3进制)

    题意: 给出n<=10个点,有m条边的无向图.问:可以从任意点出发,至多经过同一个点2次,遍历所有点的最小费用? 思路: 本题就是要卡你的内存,由于至多可经过同一个点2次,所以只能用3进制来表示 ...

随机推荐

  1. Odoo14 自定义widget小部件

    不多说先上源码. 1 odoo.define('my_company_users_widget', function (require) { 2 "use strict"; 3 4 ...

  2. ubuntu 下获取Let's Encrypt免费ssl证书

    # ubuntu 下获取Let's Encrypt免费ssl证书 # 一.安装Nginx https://www.cnblogs.com/watermeloncode/p/15476317.html ...

  3. 6.11 NOI 模拟

    \(T1\)魔法师 \(f(x)\)是各个数位之积,当\(f(x)\ne 0\),每一位只能是\(1\sim 9\),考虑数位积的质因数分解只能是\(2,3,5,7\)的形式,考虑对所有的\((a,b ...

  4. Redis 定长队列的探索和实践

    vivo 互联网服务器团队 - Wang Zhi 一.业务背景 从技术的角度来说,技术方案的选型都是受限于实际的业务场景,都以解决实际业务场景为目标. 在我们的实际业务场景中,需要以游戏的维度收集和上 ...

  5. CF906C Party (状压DP)(未完成//鬼知道啥情况)

    CF上下了数据,本地能过,一交就错 这状压不用解释,看代码就懂. #include <iostream> #include <cstdio> #include <cstr ...

  6. Git 09 IDEA撤销提交

    参考源 https://www.bilibili.com/video/BV1FE411P7B3?spm_id_from=333.999.0.0 版本 本文章基于 Git 2.35.1.2 如果提交了不 ...

  7. MapReduce计算流程

    MapReduce的计算流程 1.1 原始数据File The books chronicle the adventures of the adolescent wizard Harry Potter ...

  8. 【MySQL】从入门到精通9-数据库的备份(完结)

    上期:[MySQL]从入门到精通8-SQL数据库编程 第一章:数据的导出 回到我们的Workbench. 选择Data Export. 选择需要导出的数据库. 注意,如果选择"Export ...

  9. csrf跨站请求伪造、csrf相关装饰器、auth认证模块、基于django中间件设计项目功能

    目录 csrf跨站请求网站 什么是csrf跨站请求网站 经典例子-钓鱼网站 模拟 如何避免这种现象(预防) 如何在django中解决这个问题 form表单 ajax csrf相关装饰器 FBV CBV ...

  10. 餐饮行业SRM案例:方正璞华"采云链"携手和府捞面

    ​ 方正璞华在与和府捞面的项目中,帮助整合采购系统,系统化管理供应商,优化采购流程和数据分析,建立储备知识库. 项目背景 企业介绍 ◇ 和府捞面成立于2012年,是国内中式面食头部品牌.自2013年首 ...