HDU3001 Travelling 状压DP
来源:互联网 发布:飓风打印软件 编辑:程序博客网 时间:2024/06/10 23:01
哭瞎啊,每个城市可以经过至多两次,但没有要求必须经过两次,想用 两个状压来乱搞搞,结果自认为会T,结果 WA了,搞了一下午,没想到用三进制啊,智商捉急,参考了
http://blog.csdn.net/lenleaves/article/details/7980955 这个博客
每个城市可以经过1或2次,所以三进制可以代表所有状态了,接下来处理方式类似于二进制的,只是没有了位运算一些判断跟预处理有点繁琐
方程dp[s][i] = min(dp[s][i] , dp[s - (s除去j剩下状态)][k] + dis[k][j]),
由于没有固定的出发点,所以也就没有固定的终点,所以要以任何城市为终点的可能都要枚举到
dp[i][j]代表i状态下以 j为终点的最小花费
转移方程就是 : i 状态以j为终点的递推为(i状态中不经过j位置的状态下以k为终点 + k到j所需距离).
#define MAXN 0x3f3f3f3fint n,m;int dp[100000 + 55][10 + 5];int mp[10 + 5][10 + 5];int s[59050][10 + 5];void clear() {for(int i=0;i<59050;i++) {int tmp = i;for(int j=1;j<=10;j++) {s[i][j] = tmp%3;tmp /= 3;if(!tmp)break;}}}void init() {memset(mp,0x3f3f3f3f,sizeof(mp));memset(dp,0x3f3f3f3f,sizeof(dp));}bool input() {while(scanf("%d %d",&n,&m) == 2) {for(int i=0;i<m;i++) {int u,v,val;scanf("%d %d %d",&u,&v,&val);if(val < mp[u][v]) {mp[u][v] = val;mp[v][u] = val;}}return false;}return true;}void cal() {if(n == 1) {puts("0");return ;}int now[12];now[0] = 0;now[1] = 1;for(int i=2;i<=11;i++)now[i] = 3 * now[i - 1];/*举出刚好只过i位置的状态*/for(int i=0;i<=n;i++)dp[now[i]][i] = 0;//边界值,只经过i位置的状态再以i为终点耗费肯定为0int ans = MAXN;for(int i=0;i<now[n + 1];i++) {bool flag = true;//标记判断是否访问了所有的地方for(int j=1;j<=n;j++) {/*枚举以j为终点*/if(s[i][j] == 0) {flag = false;continue;}//i状态并没有经过jfor(int k=1;k<=n;k++) {if(s[i][k] == 0)continue;/*i状态没有经过k*/int tmp = i - now[j];//使得i状态中第j位置为0dp[i][j] = min(dp[i][j],dp[tmp][k] + mp[k][j]);/*i状态以j为终点的递推为(i状态中不过j位置的状态下以k为终点 + k到j所需距离)*/}}if(flag)//若该状态下所有地方都访问过了,就从以各个地方为终点的最佳方案中再取出最优的for(int j=1;j<=n;j++)ans = min(ans,dp[i][j]);}if(ans == MAXN)puts("-1");else printf("%d\n",ans);}void output() {}int main () {clear();while(true) {init();if(input())return 0;cal();output();}return 0;}
0 0
- HDU3001 Travelling 状压DP
- 【DP】 hdu3001 Travelling
- HDU3001 Travelling(DP)
- hdu3001 Travelling(状态压缩dp,三进制)
- hdu3001 Travelling 三进制状态压缩dp
- hdu3001 travelling
- HDU3001 Travelling
- hdu3001 Travelling
- HDU3001 Travelling
- HDU3001 Travelling
- HDU3001——Travelling(状态压缩DP)
- hdu3001 Travelling(TSP+三进制)
- HDU3001-Travelling-状态压缩
- hdu3001 Travelling 三进制状态压缩
- (状态压缩) Travelling (HDU3001)
- 3进制状态压缩DP——HDU3001 Travelling 旅行商问题
- Travelling - HDU 3001 状压dp
- HDU 3001 Travelling 状压DP
- POJ3343&HDU2413Against Mammoths (二分匹配)经典
- C语言头文件包含和编写的几个基本规则
- 关于函数授权问题
- Java进阶之欧拉工程 第十七篇【用英文写出1到1000的所有数字需要多少个字母?】
- Tomcat7.0安装过程(无桌面快捷方式版的安装模式)
- HDU3001 Travelling 状压DP
- 设计模式——装饰模式(Decorator)
- FreeRTOS代码剖析之3:内存管理Heap_3.c
- 安装OpenStack Swift
- 安卓中的几种使用SQLite的方法
- 黑马程序员----NSDictionary类使用
- USB error: no configuration chosen from 1 choice
- 有限制最短路hdu4179
- 2014-7 Andrew Ng 自动化所报告听后感-梁斌