题目链接

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 inline ll read(){
 5     int x=0,f=1;char ch=getchar();
 6     while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
 7     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
 8     return x*f;
 9 }
10
11 /***********************************************************/
12
13 int n, m;     // n < = 10
14 const int maxn = 6e4+5;
15 int d[12][maxn];
16 //用三进制形式来表示状态
17 int dist[15][15];
18 //表示路径
19 int t[12];
20 int cnt, state[maxn];
21 int temp;
22
23 //判断S的三进制是否没有一个0
24 bool legal(int S){
25     bool ok = true;
26     for(int i = 0;i <= n-1;i++){
27         if(S%3 == 0){
28             ok = false;
29             break;
30         }
31         S /= 3;
32     }
33     return ok;
34 }
35
36 void init(){
37     temp = 1;
38     for(int i = 0;i <= 10;i++){
39         t[i] = temp;
40         temp *= 3;
41     }
42 }
43
44 //i点在集合S中是否出现了至少一次
45 inline bool in(int i, int S){
46     for(int j = 0;j < i;j++)
47         S /= 3;
48     if(S%3) return true;
49     else return false;
50 }
51
52 int dp(int i, int S){
53     if(d[i][S] >= 0) return d[i][S];
54     int &ans = d[i][S];
55     ans = 1e9;
56     int S1 = S - t[i];
57     for(int j = 0;j < n;j++){
58         if(j != i && in(j, S1) && dist[j][i] != -1)
59             ans = min(ans, dp(j, S1) + dist[j][i]);
60     }
61     return ans;
62 }
63
64 int main(){
65     init();
66     while(~scanf("%d %d", &n, &m)){
67         int max_3 = 0;
68         for(int i = 0;i < n;i++)
69             max_3 += t[i];
70         cnt = 0;
71         for(int S = max_3;S < t[n];S++){
72             if(legal(S))
73                 state[cnt++] = S;
74         }
75         memset(dist, -1, sizeof(dist));
76         for(int i = 0;i < m;i++){
77             int a, b, c;
78             scanf("%d%d%d", &a, &b, &c);
79             a--;b--;
80             //更新长度
81             if(dist[a][b] == -1 || dist[a][b] > c)
82                 dist[a][b] = dist[b][a] = c;
83         }
84         memset(d, -1, sizeof(d));
85         for(int i = 0;i < n;i++)
86             d[i][t[i]] = 0;
87
88         int sum = dp(0, max_3);
89         for(int i = 0;i < n;i++){
90             for(int j = 0;j < cnt;j++){
91                 sum = min(sum, dp(i, state[j]));
92             }
93         }
94         if(sum == 1e9) printf("-1\n");
95         else printf("%d\n", sum);
96     }
97     return 0;
98 }

转载于:https://www.cnblogs.com/ouyang_wsgwz/p/9823539.html

Travelling (三进制+状压dp)相关推荐

  1. HDU 3001 Travelling (三进制状压dp)

    题意 n(n<=10)n(n个城市,知道每个城市间的旅行费用,但每个城市最多走两遍.问最小花费是多少 . 也就是每个城市可以走两次的tsp问题. 分析 最多走两次,三进制0 1 2可满足,即用三 ...

  2. HDU 3001 三进制状压DP

    HDU 3001 三进制状压DP N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方 ...

  3. HDU-3001(旅行商问题+三进制状压dp)

    #include <bits/stdc++.h> using namespace std; /* 题目大意: 给定n个点m条边的带权无向图,问有没有可能从n个点的其中一个出发,走遍其余n ...

  4. 涂抹果酱(三进制状压dp)

    涂抹果酱(状压dp) 题目描述 输入描述: 输出描述: 示例 输入 输出 说明 备注: 题目思路: 代码 欢迎关注微信公众号:Java后台开发 题目描述 Tyvj两周年庆典要到了,Sam想为Tyvj做 ...

  5. hdu3001(三进制状压)

    题目大意: 现在给你一个有n个点和m条边的图,每一条边都有一个费用,每个点不能经过超过两次,求所有点至少遍历一次的最小费用 其中n<=10 m没有明确限制(肯定不会超过1e5) 一看到这个数据范 ...

  6. 三进制状压动态规划【涂抹果酱】 题解

    前言:好不容易搞懂了这道题,感觉网上能找到的题解在我有疑问的地方都讲的不是很细,所以我来写一篇吧. 题目描述 Tyvj 两周年庆典要到了,Sam 想为 Tyvj 做一个大蛋糕.蛋糕俯视图是一个 N×M ...

  7. hdu3001 Travelling 三进制状态压缩dp

    tsp类型,只是这里面的点最多可以访问2次. 所以用一个来表示访问了多少次,正好是三进制. 对于每个状态i,先处理出第j位为几,即num[i][j],方便使用. 用dp[i][j]表示,状态i时,以j ...

  8. 蒜头君救人 状压DP

    蒜头君救人 题目描述 蒜头君是一个乐于助人的好孩子,这天他所在的乡村发生了洪水,有多名村民被困于孤岛上,于是蒜头君决定去背他们离开困境,假设蒜头君所在的村子是 n×m n×m 的网格,网格中.号代表平 ...

  9. CF1556F-Sports Betting【状压dp,数学期望】

    正题 题目链接:https://www.luogu.com.cn/problem/CF1556F 题目大意 nnn个点的一张竞赛图,每个点有一个权值aia_iai​,(i,j)(i,j)(i,j)之间 ...

最新文章

  1. Hbase报错ERROR: KeeperErrorCode = NoNode for /hbase/master
  2. Cadence IC使用教程
  3. sqlserver compact sdf, sqlite 数据库 在net中相对路径设置方法 - 摘自网络
  4. python基础语法类型_Python基本语法[2]-简单数据类型,基础
  5. pydobc连接sql server_python – PyOdbc无法连接到SQL Server实例
  6. Linux系统启动需要多长时间,Linux系统启动时间的极限优化是怎样进行的?
  7. SecondNamenode作用
  8. CMS-订单系统的分布式事务如何处理
  9. 量子通讯加密技术的技术原理
  10. 计算机网络之物理层(定义标准+码间串扰(奈氏准则、香农定理)+基带信号、宽带信号+编码、调制+传输介质)
  11. qt在window实现二维码识别
  12. Typhon升级到5.8,编译原来程序出现提示:Compilation raised exception internally
  13. [RK3399][Android7.1] Audio中的Ducking模式
  14. Windows 域之 组、OU
  15. 关于duilib在Layered Window下绘制文字不正常的BUG
  16. SPI总线通信——基于STM32MP157A
  17. 新机如何把机械硬盘中的系统克隆到固态硬盘
  18. DataX实践趟坑大全
  19. Wpf应用程序进入全屏和退出全屏
  20. 南京联通试点电力线上网 家庭用户带宽达到2M

热门文章

  1. 通配符 泛域名 linux,openssl签署自己的泛域名(通配符)证书
  2. 简单linux蠕虫,清除Linux系统上的蠕虫程序Ramen
  3. list转map stream_advancedday10可变参数不可变集合及Stream流
  4. 百度网络推广介绍网站在更换老域名时都需注意哪些?
  5. 企业为实现网络营销更要将网络营销重点放在用户价值上
  6. 网站SEO优化技巧的“减法运算”
  7. project 模板_18个施工进度计划横道图模板,自动出图超方便,全部在这儿给你准好了...
  8. 开发日记-20190505 关键词 汇编语言(四) 自定义分级视图demo
  9. RethinkDB是什么?—— 面向文档的NOSQL数据库,MVCC+Btree索引,pushes JSON to your apps in realtime采用push思路,优化的ssd存储...
  10. python3 签名 sha md5