#include <iostream>
#include <stdlib.h>
using namespace std;
#define NoEdge -1
int n;
int ad[13][13];//邻接矩阵
int* x = NULL;//到当前节点的路径的数组
int* bestx = NULL;//目前发现的最优旅行的整型数足
int cc;//当前节点的局部旅行的耗费
int bestc;//目前最优解的耗费
//交换两个整数的值
void swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
void travel(int i)
{
if(i == n)//到达叶结点
{
if(ad[x[n-1]][x[n]] != NoEdge && ad[x[n]][1] != NoEdge &&
(cc + ad[x[n-1]][x[n]] + ad[x[n]][1] < bestc || bestc == NoEdge))
{//找到更优的旅行,更新最优路径和最优耗费
for(int j = 1; j <= n; ++j)
bestx[j] = x[j];
bestc = cc + ad[x[n-1]][x[n]] + ad[x[n]][1];
}
}
else//不是叶结点,尝试子树
{
for(int j = i; j <= n; ++j)
if(ad[x[i-1]][x[j]] != NoEdge &&
(cc + ad[x[i-1]][x[j]] < bestc || bestc == NoEdge))
{//可以移动到子树,则搜索该子树
swap(x[i], x[j]);
cc += ad[x[i-1]][x[i]];
travel(i+1);
cc -= ad[x[i-1]][x[i]];
swap(x[i], x[j]);
}
}
}
int main()
{
int i,j;
scanf("%d",&n);
//随机生成邻接矩阵
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
{
scanf("%d",&ad[i][j]);
if(ad[i][j] == 0)
ad[i][j] = NoEdge;
}
//初始化变量
// for(i = 1; i <= n; ++i)
// for(j =1; j <= n; ++j)
// if(ad[i][j] == 0)
// ad[i][j] = NoEdge;
x = new int[n+1];
for(int k = 1; k <= n; ++k)
x[k] = k;
bestc = NoEdge;
bestx = new int[n+1];
cc = 0;
//搜索最优旅行
travel(2);
//输出结果
cout<<"The best travel path is : ";
for(j = 1; j <= n; ++j)
cout<<bestx[j]<<'>';
cout<<bestx[1]<<endl;
cout<<bestc<<endl;
//释放空间
delete [] x;
delete [] bestx;
return 0;
}
//结束后,cc为0;
TSP.rar_tsp
版权申诉
199 浏览量
2022-09-24
15:18:58
上传
评论
收藏 975B RAR 举报
林当时
- 粉丝: 100
- 资源: 1万+
最新资源
- las格式点云数据使用详解(附VS编译好的LAStools工具)
- KRPano插件一键解密大师1.4.0 (解压密码1234)
- 《C++沉思录》是一本由 Scoot Meyers 所著的经典 C++ 编程书籍 该书深入探讨了 C++ 的一些高级概念和技术
- 海信刷机数据 LED42K310X3D(0000)BOM1-C006软件数据与LED42K310NX3D(0000)BOM1通用
- 送货单打印软件单机版直接单机运行不需要网络
- pycdc工具,Python3.9及以上可用的反编译工具(exe转py)
- 计算机网络基础练习题.pdf
- SDIO接口远距离无线图传WIFI6模块TT-S6D2TR-105HP
- 海信智能电视刷机数据 LED42K280J3D(1000) 生产用软件数据 务必确认机编一致 强制刷机 整机USB升级程序
- 步进电机控制实验-原理图-软件代码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈