双调旅行售货员问题
2015-11-22 13:40
295 查看
#include "iostream" #include "cmath" #include "fstream" #include "algorithm" using namespace std; /* t(i)表示点{p1,p2...pi}的最短双调TSP回路,其中p1,p2..pi按x坐标排序 t(i) = min{t(k) + D(k,i) + d(k-1,i) - d(k-1,k)} 1<k<i t(1) = 0 t(1) = 2d(1,2) d(i,j)为pi,pj之间的距离 D(i,j)为pi,pi+1,pi+1...pj之间累加距离 设s(i)=d(1,2) + d(2,3) +...+ d(i-1,i) 则D(k, i) = s(k) - s(i); d(k-1, k) = s(k) - s(k-1) 所以t(i) = min{t(k) + s(i) + s(k-1) - 2s(k) + d(k-1, i)} 1<k<i */ const int MAX = 100; double s[MAX]; double t[MAX]; int N; //点的数量 struct Point { int x; //x坐标 int y; //y坐标 bool operator < (const Point &p) const { return x < p.x; } }; Point point[MAX]; double dist(Point p1, Point p2) //两点之间的距离 { return sqrt( pow((p1.x-p2.x),2) + pow((p1.y-p2.y),2) ); } //t(i) = min{t(k) + s(i) + s(k-1) - 2s(k) + d(k-1, i)} 1<k<i double dyna() { sort(point, point+N); //按x坐标排序 int i, k; s[1] = 0; for(i=2; i<=N; i++) s[i] = s[i-1] + dist(point[i-1], point[i]); t[1] = 0; t[2] = 2 * dist(point[1], point[2]); double temp; for(i=3; i<=N; i++) { t[i] = t[2] + s[i] + s[1] - 2*s[2] + dist(point[1], point[i]); for(k=3; k<i; k++) { temp = t[k] + s[i] + s[k-1] - 2*s[k] + dist(point[k-1], point[i]); if(temp < t[i]) t[i] = temp; } } return t ; } int main() { ifstream fin("旅行.txt"); cout << "输入点的数量:"; fin >> N; cout << N; cout << "\n输入各点的坐标:\n"; int i; for(i=1; i<=N; i++) { fin >> point[i].x >> point[i].y; cout << point[i].x << " " << point[i].y << endl; } cout << "最短双调TSP回路长度为:" << dyna() << endl; fin.close(); return 0; }
相关文章推荐
- 【C++】中序线索化二叉树及其遍历
- SVM多类分类方法
- 【BZOJ】2216: [Poi2011]Lightning Conductor
- C#使用ODAC向Oracle数据库插入海量实时数据
- iOS引入JavaScriptCore引擎框架(二)
- linux常用命令
- 注册asp.net 4.0 到iis
- 20135205信息安全系统设计基础第十一周学习总结
- 【BZOJ】2212: [Poi2011]Tree Rotations
- iOS 音频学习(二)
- JDBC--处理Blob
- 大数据时代——从谢顿计划说开去
- Android学习手记(6) TabActivity和TabHost
- swoole编译安装
- 【BZOJ】2172: Mario填格子
- coderforce 492B Vanya and Lanterns
- 在Ubuntu 14.04中安装最新版Eclipse
- Sql Group by 使用
- HTML5<picture>元素
- 【BZOJ】2086: [Poi2010]Blocks