#include <bits/stdc++.h>
using namespace std;
/*
题目大意:
给定n个点m条边的带权无向图,问有没有可能从n个点的其中一个出发,走遍其余n - 1个点,并且保证
每个点最多经过两次,如果可以,输出最小费用;不可以输出-1。思路:
旅行商问题改为三进制状压dp。*/
typedef long long ll;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const double eps = 1e-6;
const double pi = acos(-1.0);
const int MAX_STATE = pow(3, 10);int G[10][10];
int dp[MAX_STATE][10];
int add[10];void init_add() // 预处理每一位加1需要增加的值
{int p = 1;for(int i = 0; i < 10; i++, p *= 3){add[i] = p;}
}int get_digit(int state, int digit) // 获取当前状态第digit位的值
{for(int i = 0; i < digit; i++){state /= 3;}return state % 3;
}int main()
{int n, m;init_add();while(scanf("%d%d", &n, &m) != EOF){memset(G, 0x3f, sizeof(G));memset(dp, 0x3f, sizeof(dp));while(m--){int u, v, w;scanf("%d%d%d", &u, &v, &w);G[u - 1][v - 1] = G[v - 1][u - 1] = min(G[u - 1][v - 1], w); // 有重边,需要判断重边}int p = 1;for(int i = 0; i < n; i++, p *= 3){dp[p][i] = 0;}int ans = INF;int state = 1;for(int i = 0; i < n; i++){state *= 3; // 可能的状态数}for(int i = 0; i < state; i++){int cnt = 0;for(int j = 0; j < n; j++){if(get_digit(i, j) == 0) continue;cnt++;for(int k = 0; k < n; k++){if(j == k) continue;if(get_digit(i, k) < 2){dp[i + add[k]][k] = min(dp[i + add[k]][k], dp[i][j] + G[j][k]);}}}if(cnt == n){for(int j = 0; j < n; j++){ans = min(ans, dp[i][j]);}}}printf("%d\n", ans == INF ? -1 : ans);}return 0;
}

HDU-3001(旅行商问题+三进制状压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. 涂抹果酱(三进制状压dp)

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

  4. Travelling (三进制+状压dp)

    题目链接 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 inline ll rea ...

  5. hdu3001(三进制状压)

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

  6. HDU - 4856 Tunnels (预处理+状压dp)

    HDU - 4856 Tunnels (预处理+状压dp) [hud链接] [vj链接] 题目 Problem Description Bob is travelling in Xi'an. He f ...

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

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

  8. HDU 5691 Sitting in Line 状压dp

    Sitting in Line 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5691 Description 度度熊是他同时代中最伟大的数学家,一切 ...

  9. HDU 4899 Hero meet devil (状压DP, DP预处理)

    题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个? 思路:最直接的方法是暴力枚举长度为m的串,然后 ...

最新文章

  1. 使用Hystrix实现自动降级与依赖隔离[微服务]
  2. Python使用re模块进行正则匹配日期和时间
  3. iscsi target 配置(服务端安装)--一
  4. 如何用css让一个容器水平垂直居中
  5. 监控j服务器jvm运行情况 - spring boot jvisualvm
  6. java 最近将工作中用到的工具总结——日期工具
  7. 大数据入门基础教程系列
  8. C#连接Sqlite 出现:混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。的解决方案...
  9. 【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路
  10. e分钟带你利用Python制作词云图
  11. c语言中的scanf在java中应该怎么表达,Scanner类。
  12. SIGCHLD waitpid, 小心子进程结束事件被偷了
  13. jupyter notbook远程连接配置(Ubuntu16.04)
  14. UE4(虚幻4)引擎下载与安装
  15. java gbk编码_java 中文转GBK码
  16. uniapp使用网易易盾
  17. swift5.0 代码实现跳转页面Segue (performSegue and prepare)
  18. 档案管理学川大972 | 档案信息资源开发与利用
  19. 三位数分解百位,十位,个位
  20. win10共享打印机709问题

热门文章

  1. XTU C语言程序设计1236Fibonacci
  2. 数据分析可视化15 PyEcharts Flask 集成案例
  3. linux的内核设计,Linux内核设计的艺术 清晰完整版PDF+配套源码
  4. 信息技术服务连续性计划
  5. C语言实战--全屏截图
  6. rapidjson安装使用
  7. 2022-2028年全球及中国药片压片机行业发展现状调研及投资前景分析
  8. 面试题系列——1.科大讯飞java软件开发
  9. js练习题:构建函数创建一个电脑对象
  10. KUKA机器人通过EthernetKRL控制