(1)这道题最多可以走两次,所以有0, 1, 2三种状态,所以我们要用三进制

如果要用三进制,就要自己初始化两个数组, 一个是3的n次方,一个是三进制数的第几位的数字是什么

void init()
{
three[0] = 1;
REP(i, 1, 11)
three[i] = three[i-1] * 3;
REP(i, 0, three[10])
{
int t = i;
REP(j, 0, 10)
{
digit[i][j] = t % 3;
t /= 3;
if(t == 0) break;
}
}
}

同时这里不能用位运算,因为不是二进制。如果涉及到某一位加1,就加上就好了,不能用|

然后统计答案的时候比较麻烦,要枚举每一位是不是0

(2)凡是涉及到进制的,下标都从0开始。输入的时候记得要下标减减

(3)Tsp问题的基本套路是这样的(我用的是填表法)

dp数组全部初始化为最大值

起点初始化为0,即dp[1 << i][i] = 0

第一层循环枚举所有可能的状态S

第二层枚举当前点i,这里要求这个点已经经过

第二层枚举之前的点j,这里同样要求这个点已经经过

dp[state][i] = min(dp[state][i], dp[state^(1 << i)][j] + dist[j][i])

记住要去掉当前这个点

最后答案就是min(dp[(1 << n) - 1][i])

#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 15;
int dist[MAXN][MAXN], dp[60000][MAXN], n, m;
int three[MAXN], digit[60000][MAXN]; void init()
{
three[0] = 1;
REP(i, 1, 11)
three[i] = three[i-1] * 3;
REP(i, 0, three[10])
{
int t = i;
REP(j, 0, 10)
{
digit[i][j] = t % 3;
t /= 3;
if(t == 0) break;
}
}
} int main()
{
init();
while(~scanf("%d%d", &n, &m))
{
memset(dist, 0x3f, sizeof(dist));
while(m--)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w); u--; v--; //注意要--
dist[u][v] = dist[v][u] = min(dist[u][v], w);
} int ans = 1e9;
memset(dp, 0x3f, sizeof(dp)); //初始化不能忘
REP(i, 0, n) dp[three[i]][i] = 0; REP(S, 0, three[n])
{
bool ok = true;
REP(i, 0, n)
{
if(digit[S][i] == 0) { ok = false; continue; } //i要已经经过。
REP(j, 0, n) if(digit[S][j] >= 1) //j已经经过
dp[S][i] = min(dp[S][i], dp[S-three[i]][j] + dist[j][i]);
}
if(ok)
REP(i, 0, n)
ans = min(ans, dp[S][i]);
}
printf("%d\n", ans == 1e9 ? -1 : ans);
} return 0;
}

HDU3001 Traveling (状压dp+三进制+Tsp问题总结)的更多相关文章

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

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

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

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

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

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

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

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

  5. hdu3001(状压dp)

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

  6. HDU3001 Travelling 状压DP

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

  7. HDU 4026 Unlock the Cell Phone 状压dp(类似TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4026 Unlock the Cell Phone Time Limit: 6000/3000 MS ...

  8. poj 3311 Hie with the Pie (状压dp) (Tsp问题)

    这道题就是Tsp问题,稍微加了些改变 注意以下问题 (1)每个点可以经过多次,这里就可以用弗洛伊德初始化最短距离 (2)在循环中集合可以用S表示更清晰一些 (3)第一维为状态,第二维为在哪个点,不要写 ...

  9. POJ1185 状压dp(二进制//三进制)解法

    很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...

随机推荐

  1. ndk,cygwin编译 .so动态库

    注意: ndk .cygwin 安装路径尽量要和sdk放到一个磁盘里,设置环境变量. 例如D: 根目录  变量名:ndk   值:/cygdrive/d/android-ndk-r8e 打开cygwi ...

  2. 完整的html+css+javascript实现跟随鼠标移动显示选中效果

    1,显示效果: 2,html结构 <div class="process_list-lpu"> <div class="process_line&quo ...

  3. HDU 5168

    把边按权值排序后,就相当于求一个子序列以1开始和以n结束.由于边权递增,而且相差>=k,所以,边的顺序也必定是递增的.知道,当处理一条出边时,必定是从入边选择一条最优的边,考虑两个因素,入边的权 ...

  4. 金蝶KIS标准版与金蝶K3的差别

    一.数据库  金蝶KIS标准版使用MS Access数据库.该数据库适用于小规模的数据处理,是比較经济的数据库解决方式,但当单个表的数据记录超过5万条时.执行的速度和稳定性都将受到一定程序的影响. K ...

  5. 【Dubbo实战】基础学习篇(一)

    Dubbo的简单介绍 是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000多个服务提供30多亿次訪问量支持.并被广泛应用于阿里巴巴集团的各成员网站. Dubbo是一个分布式服 ...

  6. Android 零基础学习之路

    第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和StringBuffer的使用.正則表達式. 3.面向对象的抽象.封装,继承,多态.类与对象.对象初始化 ...

  7. wpf 全局异常捕获处理

    /// <summary> /// App.xaml 的交互逻辑 /// </summary> public partial class App : Application { ...

  8. 深度理解Jquery 中 scrollTop() 方法

    这是工作遇到scrollTop() 方法.为了强化自己,把它记录在博客园当中. 下面就开始scrollTop 用法讲解: scrollTop() 定义和用法 scrollTop() 方法设置或返回被选 ...

  9. docker compose线下安装

    Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 Compose 中你可以使用 YAML 文件来配置你的应用服务.然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务 ...

  10. 关于jquery文件上传插件 uploadify 3.1的使用

    要使用uplaodify3.1,自然要下载相应的包,下载地址http://www.uploadify.com/download/,这里有两种包,一个是基于flash,免费的,一个是基于html5,需要 ...