【ACMclub周赛5】Problem E——TSP旅行商问题
来源:互联网 发布:淘宝天猫历史价格 编辑:程序博客网 时间:2024/06/05 19:40
题目:点击打开链接
题目简化一下就是一个旅行者可以在任意一点出发,遍历所有顶点后回到原点,问可以走的最短路程。很著名的NP-HARD旅行商问题。
TSP问题最简单的求解方法是枚举法,时间复杂度是O(n!),
其余的解都是无法证明的最优近似解,但是可以直接拿来用,此外还有模拟退火,floyd+DP,Edmonds-Johnson等各种方法,贴个模板吧,可以用poj 2404练一下手。
#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#define MAX_NUM 0x3f3f3f3f#define MIN(x, y) (((x) < (y)) ? (x) : (y))using namespace std;int nstations, ntrails;int grid[20][20];int num;int part_result;int degree[20];int nodes[20];int used[20];int search(int start, int end, int sum){ int i; if (start == end) { part_result = MIN(sum, part_result); return 0; } if (used[nodes[start]] == 0) { used[nodes[start]] = 1; for (i = start + 1; i < num; ++i) { if (used[nodes[i]] == 1) continue; if (sum + grid[nodes[start]][nodes[i]] >= part_result) continue; used[nodes[i]] = 1; search(start + 1, end, sum + grid[nodes[start]][nodes[i]]); used[nodes[i]] = 0; } used[nodes[start]] = 0; return 0; } return search(start + 1, end, sum);}int main(){ int i, j, k; int node0, node1, len; int tlen; int result; while (cin>>nstations && nstations!=0) { cin>>ntrails; result = 0; for (i = 0; i <= nstations; ++i) { degree[i] = 0; used[i] = 0; for (j = 0; j <= nstations; ++j) grid[i][j] = MAX_NUM; } for (i = 0; i < ntrails; ++i) { scanf("%d %d %d", &node0, &node1, &len); result += len; degree[node0]++; degree[node1]++; grid[node0][node1] = grid[node1][node0] = MIN(grid[node1][node0], len); } for (k = 1; k <= nstations; ++k) { for (i = 1; i <= nstations; ++i) { for (j = 1; j <= nstations; ++j) { grid[i][j] = MIN(grid[i][j], grid[i][k] + grid[k][j]); } } } num = 0; for (k = 1; k <= nstations; ++k) { if (degree[k] & 1) nodes[num++] = k; } part_result = MAX_NUM; search(0, num, 0); result += part_result; cout<<result<<endl; } return 0;}
- 【ACMclub周赛5】Problem E——TSP旅行商问题
- 【ACMclub周赛5】Problem A——购物停车
- 【ACMclub周赛5】Problem D——拼火柴
- UVa Problem 116 Unidirectional TSP (单向旅行商问题)
- 旅行商问题(travelling salesman problem, TSP) 解题报告
- 回溯法——旅行商(TSP)问题
- 分支定界法——旅行商(TSP)问题
- 【ACMclub周赛5】Problem C——求两圆的交叉面积
- 贪心解决:TSP问题(Travelling Salesman Problem)即旅行商问题
- 旅行商问题(TSP问题)
- 动态规划方法解旅行商问题(TSP Traveling Salesperson Problem)
- 数学建模常用Matlab/Lingo/c代码总结系列——旅行商TSP问题
- 旅行商(TSP)及相关问题列表
- TSP旅行商问题的C++解决方案
- 动态规划求解TSP(旅行商)问题
- 动态规划 解TSP旅行商问题
- 双调旅行商问题 (Bitonic TSP)
- 清华OJ TSP旅行商问题
- uva 197 Cube(空间几何+回溯)
- 在sql*plus中显示语句执行所用的时间
- PowerMock注解PowerMockIgnore的使用方法
- 站长如何利用百度贴吧做好网络营销
- android之View的启动过程
- 【ACMclub周赛5】Problem E——TSP旅行商问题
- POJ 1459 Power Network
- [3] Android的init进程
- MU Puzzle(推理找规律)(多校第六场))
- seo培训常识
- 映射集合属性之⑤:Map集合属性
- 确定网站盈利模式方向及可行性分析
- 如何优化MySQL insert性能
- SEO中的精髓