博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3001 Travelling
阅读量:4988 次
发布时间:2019-06-12

本文共 1394 字,大约阅读时间需要 4 分钟。

HDU_3001

    相比于普通的TSP问题,这个题加了“每个点之多经过两次”的限制,因此改用三进制表示每个点的状态就可以了。

#include
#include
#include
#define INF 0x3f3f3f3f#define MAXD 15#define ST 59049int N, M, D, g[MAXD][MAXD], f[ST][MAXD], ANS;int bit[] = {
1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049};void init(){ int i, x, y, z; memset(g, 0x3f, sizeof(g)); for(i = 0; i < M; i ++) { scanf("%d%d%d", &x, &y, &z), -- x, -- y; if(z < g[x][y]) g[x][y] = g[y][x] = z; }}int can(int st){ for(int i = 0; i < N; i ++, st /= 3) if(st % 3 == 0) return 0; return 1;}void solve(){ int i, j, k, n, t; for(i = 0, D = 1; i < N; i ++) D *= 3; ANS = INF; for(i = 0; i < D; i ++) for(j = 0; j < N; j ++) f[i][j] = INF; for(i = 0; i < N; i ++) f[bit[i]][i] = 0; for(i = 0; i < D; i ++) for(j = 0; j < N; j ++) if(f[i][j] != INF) { for(k = 0, t = i; k < N; k ++, t /= 3) if(t % 3 < 2) f[i + bit[k]][k] = std::min(f[i + bit[k]][k], f[i][j] + g[j][k]); if(can(i)) ANS = std::min(ANS, f[i][j]); } printf("%d\n", ANS == INF ? -1 : ANS);}int main(){ while(scanf("%d%d", &N, &M) == 2) { init(); solve(); } return 0; }

转载于:https://www.cnblogs.com/staginner/archive/2012/09/04/2670433.html

你可能感兴趣的文章
[收藏]Oracle技术网里的链接
查看>>
varchar和Nvarchar区别
查看>>
2o_TwoTips
查看>>
iosblock用法
查看>>
【TensorFlow】Win7下使用Object Detection API 训练自己的数据集,并视频实时检测
查看>>
json和jsonp
查看>>
Python --标准库 存储对象 (pickle包,cPickle包)
查看>>
SQL Server 2016 查询存储性能优化小结
查看>>
遍历xml所有节点 采用dom4j,jdom
查看>>
鸟哥学习笔记四(基础篇第九章)
查看>>
Unity内存优化
查看>>
Linux学习之CentOS(三)--初识linux的文件系统以及用户组等概念
查看>>
传递参数ref与输出参数out
查看>>
java1.8对集合中对象的特有属性进行排序
查看>>
mysql搭建主从
查看>>
闲着就把这个翻译了。。。基本没什么水平- -
查看>>
自定义滚动条——控制文字的滚动
查看>>
Android 手工测试代码覆盖率增强版
查看>>
延伸正则表达式
查看>>
Spark报错:Failed to locate the winutils binary in the hadoop binary path
查看>>