终于刷完搜索专题了。

题意:给定n个城市,每个城市参观不能超过两次,两个城市之间有道路通过需要花费X,求通过能所有城市的最小花费。

思路:每个城市有三个状态0,1,2,可用三进制存储所有城市的访问状态。DP[i][j]表示当前状态为i,j是道路的最后一个城市。

如果j城市可以到达k城市,那么下一个状态就是next = i + bit[k],转移方程DP[next][k] = min(DP[next][k], DP[i][j] + cost[j][k]),cost[j][k]表示城市j到k的花费。

AC代码: 374ms

#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<utility>
using namespace std;
typedef pair<int, int> PI;
const int inf = 0x3f3f3f3f;
const int maxn = 60000;
int num[maxn][15], bit[15], cost[15][15], dp[maxn][15];
void init() {
	bit[0] = 1;
	for(int i = 1; i <= 10; ++i)
		bit[i] = bit[i - 1] * 3;
	for(int i = 0; i < bit[10]; ++i) {
		int x = i;
		for(int j = 0; j < 10; ++j) {
			num[i][j] = x % 3;
			x /= 3;
		}
	}
}

int main() {
	init();
	int n, m;
	while(scanf("%d%d", &n, &m) == 2) {
		memset(cost, -1, sizeof(cost));
		int x, y, c;
		for(int i = 0; i < m; ++i) {
			scanf("%d%d%d", &x, &y, &c);
			if(cost[x-1][y-1] == -1) {
				cost[x-1][y-1] = cost[y-1][x-1] = c;
			}
			else {
				cost[x-1][y-1] = cost[y-1][x-1] = min(cost[x-1][y-1], c); //去重边
			}
		}

		memset(dp, inf, sizeof(dp));
		//初始化边界
		for(int i = 0; i < n; ++i) {
			dp[ bit[i] ][i] = 0;
		}
		int ans = inf;
		for(int i = 0; i < bit[n]; ++i) {
			int flag = 1;
			for(int j = 0; j < n; ++j) {
				if(num[i][j] == 0) flag = 0; //当前状态有从未经过的点
				if(dp[i][j] == inf) continue;

				for(int k = 0; k < n; ++k) {
					if(k == j || num[i][k] >= 2 || cost[j][k] == -1) continue;
					int walk = i + bit[k]; //转换到新的状态
					dp[walk][k] = min(dp[walk][k], dp[i][j] + cost[j][k]);
				}
			}
			if(flag) {
				for(int j = 0; j < n; ++j) ans = min(ans, dp[i][j]);
			}
		}
		if(ans == inf) ans = -1;
		printf("%d\n", ans);
	}

	return 0;
}

如有不当之处欢迎指出!

HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二的更多相关文章

  1. HDU 3001 Travelling ——状压DP

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

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

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

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

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

  4. HDU3001 Traveling (状压dp+三进制+Tsp问题总结)

    (1)这道题最多可以走两次,所以有0, 1, 2三种状态,所以我们要用三进制 如果要用三进制,就要自己初始化两个数组, 一个是3的n次方,一个是三进制数的第几位的数字是什么 void init() { ...

  5. [kuangbin带你飞]专题二十二 区间DP

            ID Origin Title   17 / 60 Problem A ZOJ 3537 Cake   54 / 105 Problem B LightOJ 1422 Hallowee ...

  6. [kuangbin带你飞]专题二十 斜率DP

            ID Origin Title   20 / 60 Problem A HDU 3507 Print Article   13 / 19 Problem B HDU 2829 Lawr ...

  7. HDU - 3533 bfs [kuangbin带你飞]专题二

    看了好久的样例才看懂. 题意:有一个人要从(0,0)走到(n,m),图中有k个碉堡,每个碉堡可以向某个固定的方向每隔t秒放一次炮,炮弹不能穿越另一个碉堡,会被阻挡.人在移动的过程中不会被炮弹打到,也就 ...

  8. HDU - 3085 双向BFS + 技巧处理 [kuangbin带你飞]专题二

    题意:有两只鬼,一个男孩女孩被困在迷宫中,男孩每秒可以走三步,女孩只能1步,鬼可以两步且可以通过墙.问男孩女孩是否可以在鬼抓住他们之前会合? 注意:每秒开始鬼先移动,然后两人开始移动. 思路:以男孩和 ...

  9. HDU - 1067 Gap (bfs + hash) [kuangbin带你飞]专题二

    题意:    起初定28张卡牌的排列,把其中11,  21, 31, 41移动到第一列,然后就出现四个空白,每个空白可以用它的前面一个数的下一个数填充,例如43后面的空格可以用44填充,但是47后面即 ...

随机推荐

  1. python_爬校花图片

    如何用python爬取校花图片并保存到本地来? 1. 获取什么数据? 校花名字  name 校花所在学校 school 校花图片的url   img_ulr 2.如何获取? 打开网页http://ww ...

  2. MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  3. PDO prepare预处理语句

    预处理语句 $dsn="mysql:host=localhost;dbname=emp"; try{ $pdo=new PDO($dsn,'root','root'); }catc ...

  4. Java自学能学会吗?最新Java高级学习路线

    就好像一千个人心中有一千个哈利波特一样,这个答案不绝对也不唯一,Java好学但自学的确阻力有些大,作为一门技术语言,它所蕴含的智慧绝对不是靠几本XX入门,XX框架之类的书所能概括,自学Java你要做好 ...

  5. get请求中文乱码及get,post编码探究

    在我使用get请求进行查询的时候遇到一个问题: 当我的请求参数中有中文时,出现乱码. 可是即使我设置了Spring的characterEncodingFilter,也还是出现乱码. 原因:tomcat ...

  6. 2、jQuery的一些静态方法

    上次粗略说了jQuery的整体结构,这次挑一些静态方法先说一下吧 一.noConflict函数 这个函数是个比较有意思的函数,基本上很少用到,之所以说他是因为这个函数在最下面,太显眼了,先把他解决掉. ...

  7. 百度插件webuploader的坑!

    前言: 自因为项目中需要使用上传插件,所以之前找了几款上传插件.但是呢,小的上传插件是不支持我们项目上传的(做虚拟机项目的,一个镜像可能好几个G),所以呢这个插件要支持分片上传,拓展性要高(肯定的啦, ...

  8. nongsanli

    之后的内容只能追加,不可以修改,删除. 1.    mysql可以对字段进行MD5加密, 加密插入:INSERT INTO t_user(id,username,PASSWORD) VALUES('5 ...

  9. WPF 自定义图表(柱状图,曲线图)

    1.功能 实现图表的数据绑定,动态绑定,属性更改绑定. 本文提供了一种思路. 2.原理 使用canvas绘制,使用反射来确定属性的绑定. 3.效果: 柱状图效果: 曲线图效果: 感谢阅读. 源码地址: ...

  10. BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]

    2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...