HDU 3001 Traveling(状压DP)
题目大意:10个点的TSP问题,但是要求每个点最多走两边,不是只可以走一次,所以要用三进制的状态压缩解决这个问题。可以预处理每个状态的第k位是什么。
原代码链接:http://blog.csdn.net/accry/article/details/6607703
3进制,代表走过这个点的次数
#include <cstdio>
#include<cstdlib>
#include <cstring>
#define INF 0x1f1f1f1f
#define min(a,b) (a) < (b) ? (a) : (b)
using namespace std; int N,M;
int tri[12] = {0,1,3,9,27,81,243,729,2187,6561,19683,59049};
int dig[59050][11]; //dig[state][k_dig] 状态state的第k位是多少
int edge[11][11],dp[59050][11]; int main()
{
#ifndef ONLINE_JUDGE
freopen("C:\\Users\\Zmy\\Desktop\\in.txt","r",stdin);
// freopen("C:\\Users\\Zmy\\Desktop\\out.txt","w",stdout);
#endif // ONLINE_JUDGE //
// char stit[200];
// for (int i=0;i<12;i++)
// {
// itoa(tri[i],stit,3);
// puts(stit);
// } for(int i = 0; i < 59050; ++i)
{
int t = i;
for(int j = 1; j <= 10; ++j)
{
dig[i][j] = t%3;
t /= 3;
if(t == 0)break;
}
} // itoa(123,stit,3);
// puts(stit);
//
// puts("tst");
// for(int j = 1; j <= 10; ++j)
// printf("%d ",dig[123][j]); while(scanf("%d%d",&N,&M) != EOF)
{
memset(edge,INF,sizeof(edge)); int a,b,c;
int m2=M;
while(M --)
{
scanf("%d%d%d",&a,&b,&c);
if(c < edge[a][b])edge[a][b] = edge[b][a] = c;
} // for (int i=1;i<=N;i++)
// {
// for (int j=1;j<=N;j++)
// printf("%d ",edge[i][j]);
// puts("");
// } memset(dp,INF,sizeof(dp)); for(int i = 1; i <= N; ++i)dp[tri[i]][i] = 0; int ans = INF;
for(int S = 0; S < tri[N+1]; ++S)
{
int visit_all = 1;
for( int i = 1; i <= N; ++i)
{
if(dig[S][i] == 0)visit_all = 0;
if(dp[S][i] == INF)continue; for(int j = 1; j <= N; ++j)
{
if(i == j)continue;
if(edge[i][j] == INF ||dig[S][j] >= 2)continue;
int newS = S + tri[j];
dp[newS][j] =min(dp[newS][j],dp[S][i] + edge[i][j]);
}
} if(visit_all)
{
for(int j = 1; j <= N; ++j)
ans = min(ans,dp[S][j]);
} } if(ans == INF)
{
puts("-1");
continue;
}
printf("%d\n",ans);
}
return 0;
}
HDU 3001 Traveling(状压DP)的更多相关文章
- HDU 3001 Travelling ——状压DP
[题目分析] 赤裸裸的状压DP. 每个点可以经过两次,问经过所有点的最短路径. 然后写了一发四进制(真是好写) 然后就MLE了. 懒得写hash了. 改成三进制,顺利A掉,时间垫底. [代码] #in ...
- HDU - 3001 Travelling 状压dp + 三进制 [kuangbin带你飞]专题二
终于刷完搜索专题了. 题意:给定n个城市,每个城市参观不能超过两次,两个城市之间有道路通过需要花费X,求通过能所有城市的最小花费. 思路:每个城市有三个状态0,1,2,可用三进制存储所有城市的访问状态 ...
- HDU 3001 Travelling (状压DP + BFS)
题意:有一个人要去旅游,他想要逛遍所有的城市,但是同一个城市又不想逛超过2次.现在给出城市之间的来往路费,他可以选择任意一个点为起点. 问逛遍所有城市的最低路费是多少. 析:用三进制表示每个城市的访问 ...
- HDU 4284Travel(状压DP)
HDU 4284 Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1 ...
- HDU 4336 容斥原理 || 状压DP
状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示 ...
- HDU - 5117 Fluorescent(状压dp+思维)
原题链接 题意 有N个灯和M个开关,每个开关控制着一些灯,如果按下某个开关,就会让对应的灯切换状态:问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和. 思路1.首先注意到N< ...
- hdu 4114(状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4114 思路:首先是floyd预处理出任意两点之间的最短距离.dp[state1][state2][u] ...
- HDU 3091 - Necklace - [状压DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3091 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- HDU 3811 Permutation 状压dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3811 Permutation Time Limit: 6000/3000 MS (Java/Othe ...
- HDU 5838 (状压DP+容斥)
Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...
随机推荐
- 【HAOI2009】【P1307】毛毛虫
感觉相比其他树归题简单多了,不过有点绕(也许是我的思路很奇怪一.一)(这是省选题啊,就算作为T1这题也太水了,HA好弱……) 原题: 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一 ...
- Linux驱动设计—— 驱动调试技术
参考博客与书籍: <Linux设备驱动开发详解> <Linux设备驱动程序> http://blog.chinaunix.net/uid-24219701-id-2884942 ...
- (转) SLAM系统的研究点介绍 与 Kinect视觉SLAM技术介绍
首页 视界智尚 算法技术 每日技术 来打我呀 注册 SLAM系统的研究点介绍 本文主要谈谈SLAM中的各个研究点,为研究生们(应该是博客的多数读者吧)作一个提纲挈领的摘要.然后,我 ...
- unity3d中Find的用法
在unity3d中用Find可以直接查找组件 例子一: 该脚本时绑在main Camera上的,"/Scene/player"这是在Hierarchy目录下直接找寻Scene ...
- 斐波那契数列PHP非递归数组实现
概念: 斐波那契数列即表达式为 a(n) = a(n-1)+a(n-2) 其中 a1 =0 a2 = 1 的数列 代码实现功能: 该类实现初始化给出n,通过调用getValue函数得出a(n)的值 ...
- android数据存储之SharedPreferences
一.SharedPreferences简介 (1)SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activ ...
- Spring3.0.6定时任务task:scheduled
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- Hive(五):hive与hbase整合
配置 hive 与 hbase 整合的目的是利用 HQL 语法实现对 hbase 数据库的增删改查操作,基本原理就是利用两者本身对外的API接口互相进行通信,两者通信主要是依靠hive_hbase-h ...
- (zt)Lua的多任务机制——协程(coroutine)
原帖:http://blog.csdn.net/soloist/article/details/329381 并发是现实世界的本质特征,而聪明的计算机科学家用来模拟并发的技术手段便是多任务机制.大致上 ...
- 【转】ODBC、OLE DB、 ADO的区别
一.ODBC ODBC的由来 1992年Microsoft和Sybase.Digital共同制定了ODBC标准接口,以单一的ODBC API来存取各种不同的数据库.随后ODBC便获得了许多数据库厂商和 ...