题目描述

有若干个城市,任何两个城市之间的距离都是确定的,现要求一旅行商从某城市出发必须经过每一个城市且只在一个城市逗留一次,最后回到出发的城市,问如何事先确定一条最短的线路以保证路径最短?

输入

输入两个整数n,m分别代表城市数量,边数量,2<=n<=8,n-1<=m<=2*n

接下来m行每行输入有3个整数x,y,z代表x和y城市之间有一条长为z的路,保证输入的图是连通的,旅行商总是从1城市出发。

输出

要求求出最短的路径,和该路径的长度,如果不存在这样的路径你只需要输出-1。

样例输入 Copy

4 6

1 2 30

1 3 6

1 4 4

2 3 5

2 4 10

3 4 20

样例输出 Copy

1 3 2 4 1

25

package book;

import java.util.Scanner;

public class TSP {

static int n,m;//n城市数量,m边数量

static int grh[][];//地图

static int curentlength,bestlength;//当前距离,最短距离

static int curent[],best[];//当前路线,最好的路线

static int Max=Integer.MAX_VALUE;

public static void main(String[] args) {

Scanner sc=new Scanner(System.in);

n=sc.nextInt();

m=sc.nextInt();

grh=new int[n+1][n+1];

curent=new int[n+1];

best=new int[n+1];

curentlength=0;

bestlength=-1;

for(int i=1;i<=n;i++) {

curent[i]=i;

for(int j=1;j<=n;j++) {

grh[i][j]=Max;//初始化地图,每个点之间的距离都是无穷大

}

}

for(int i=1;i<=m;i++) {

int start = sc.nextInt();

int end = sc.nextInt();

int length = sc.nextInt();

grh[start][end]=length;

grh[end][start]=length;//把所有的边存储起来

}

backtrace(2);

if(bestlength!=-1) {

for(int i=1;i<=n;i++) {

System.out.print(best[i]+" ");

}

System.out.println("1");

System.out.println(bestlength);

}else {

System.out.println("-1");

}

}

private static void backtrace(int t) {

if(t==n) {

if(grh[curent[n-1]][curent[n]]!=Max&&grh[curent[n]][1]!=Max&&

(curentlength+grh[curent[n-1]][curent[n]]+grh[curent[n]][1]

//1.当到准备去第n个城市的时候,首先要判断当前售货员与第n个点有没有路线,没有路线就剪掉

//2.要判断第n个点与起点1有没有路线,没有也要剪掉

//3.判断走完这条路线,回到原点的总距离是不是小于已经知道的最短距离,如果大于也剪掉

//如果都符合,就要做更新操作

for(int i=1;i<=n;i++) {

best[i]=curent[i];

}

bestlength=curentlength+grh[curent[n-1]][curent[n]]+grh[curent[n]][1];

}

}else {

for(int i=t;i<=n;i++) {

if(grh[curent[t-1]][curent[i]]

//上面的剪枝条件是,t-1表示现在售货员所在的城市,i表示他现在要准备去的城市,两者之间必须要有边

//bestlength=-1表示第一次走

//符合条件我们就需要交换

swap(t,i);

curentlength=curentlength+grh[curent[t-1]][curent[t]];

backtrace(t+1);

curentlength=curentlength-grh[curent[t-1]][curent[t]];

swap(t,i);

}

}

}

}

private static void swap(int t, int i) {

int temp=0;

temp=curent[t];

curent[t]=curent[i];

curent[i]=temp;

}

}

旅行售货员 java_JAVA旅行商售货TSP相关推荐

  1. matlab算法大全 pdf_遗传模拟退火算法求解旅行商(TSP)问题

    hello大家好,很高兴又和大家见面了.在之前的遗传算法(GA)求解旅行商问题(TSP)MATLAB代码讲解和模拟退火(SA)算法求解旅行商 (TSP)问题MATLAB代码讲解这两篇推文中,分别讲解了 ...

  2. 蚁群算法--旅行商(TSP)问题详解

    蚁群算法--旅行商(TSP)问题详解 蚁群算法 问题与分析 结果显示与分析 蚁群算法 蚁群算法(ant colony optimization)最早是由Marco Dorigo等人在1991年提出,他 ...

  3. 优化 | 浅谈旅行商(TSP)的七种整数规划模型

    作者:彭澜 纽约州立大学水牛城分校工业工程系在读博士生,研究方向:车辆路径规划问题(VRP) 旅行商问题(TSP)是运筹学领域最知名的问题之一.本文将从整数规划模型建模的角度,介绍七种不同的建模方式, ...

  4. MATLAB实战系列(五)-模拟退火(SA)算法求解旅行商 (TSP)问题MATLAB代码讲解

    一 | 模拟退火图片演示 首先为了让各位能够对模拟退火算法有一个直观的视觉冲击,现在我们想要找到下面这幅图的极大值点,很明显这幅图中有许多局部极值点,如果仅仅采用简单的爬山算法很容易陷入局部最优. 这 ...

  5. 遗传算法解决旅行商(TSP)问题

    遗传算法解决旅行商问题 作为NP难的经典问题,旅行商问题有多种算法可以解决. 我学习的过程中,首先看到了模拟退火算法解决旅行商问题的过程,模拟退火算法可以保证100%的找到全局最小值. 在我研究遗传算 ...

  6. 算法设计与分析——回溯法——旅行售货员问题

    #include<iostream> #include<bits/stdc++.h> using namespace std; const int noEdge=65535; ...

  7. 模拟退火(SA, Simulated Annealing)算法解决旅行商TSP问题

    01 什么是旅行商问题(TSP)? TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出.问题描述如 ...

  8. MATLAB实战系列(十九)-遗传算法解决TSP(旅行商)问题-应用及解析(文末附MATLAB源码)

    接上篇MATLAB实战系列(十八)-遗传算法解决TSP(旅行商)问题-算法原理 https://wenyusuran.blog.csdn.net/article/details/114060030 感 ...

  9. 美国本土四十八个州府48个州府所在城市的TSP旅行商回路17110km

    美国本土四十八个州府48个州府所在城市的旅行商回路17110km 在网上找了美国四十八个州府城市的经纬度http://chi.timegenie.com/latitude_longitude/coun ...

最新文章

  1. 1282. Game Tree
  2. 跨模态学习在三维语义分割领域适应中的应用
  3. 8.QT的事件循环与事件发送相关类
  4. MySQL优化之查询缓存(mysql8官方已经废弃这个功能)
  5. 黑科技揭秘:百种异常随机注入,专有云为何稳如泰山 1
  6. 跨平台、多浏览器页面测试
  7. python绘制直方图plt_Python:matplotlib绘制直方图
  8. Django日志模块logging的配置详解
  9. 云计算:21世纪的商业平台
  10. [引用]关于C#操作INI文件的总结
  11. Spring中的depends-on
  12. WebSphere概述
  13. endnote 文献管理软件使用教程
  14. RecycleView刷新 齿轮转动动画效果
  15. Coin Change
  16. 计算机毕业设计SSM电商直播订单管理系统【附源码数据库】
  17. 感知系统性能评估分析解决方案
  18. yota3墨水屏设置_YOTA3墨水屏“直通”技术取代旧“投射”功能,体验全面升级...
  19. PS鼠绘教程:PS鼠绘炫酷红色保时捷跑车
  20. Word在试图打开文件时遇到错误,请尝试下列方法:检查文档或驱动器的文件权限 确保有足够的内存和磁盘空间 用文本恢器打开文件

热门文章

  1. matlab中sinks,MATLAB Simulink模块库详解(二)Sinks篇
  2. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、为指定变量添加单位信息、自定义overall的标签名称
  3. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(水平带状图、垂直带状图、抖动程度配置)实战
  4. TypeError: expected str, bytes or os.PathLike object, not module
  5. 为Jupyter notebook配置R kernel过程及踩坑记录
  6. python代码计算图像的分辨率
  7. java中打开文件显示_从java程序中打开任何文件
  8. 精益数据分析(学习笔记)——长期更新
  9. 测序技术及常见的有几种平台类型
  10. Python3学习笔记-字符串和编码