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

本文共 1306 字,大约阅读时间需要 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; }

转载地址:http://vvuco.baihongyu.com/

你可能感兴趣的文章
删除LVM步骤
查看>>
Zookeeper客户端
查看>>
linux常用指令
查看>>
Servlet Demo
查看>>
Struts2中的<s:action>标签
查看>>
Java中取某一个范围的随机数
查看>>
一条复杂SQL实现思路
查看>>
我的友情链接
查看>>
android app 退出时提示确认
查看>>
win10 配置
查看>>
java 编译100个范例
查看>>
Session Cookie ServletContext
查看>>
单点登录SSO
查看>>
遇见有的软件开启后画面模糊怎么解决
查看>>
好系统重装助手教你怎么识别固态硬盘还是机械硬盘
查看>>
170. js中获取随机数 (记录一下)
查看>>
深入浅出爬虫之道: Python、Golang与GraphQuery的对比
查看>>
DHCP配置
查看>>
MySQL性能测试(二)——Ubuntu 14.4.02, MySQL 5.6.25, sysbench 4.8
查看>>
我的友情链接
查看>>