原题链接:1150 Travelling Salesman Problem (25分)
参考的柳神博客:PAT 1150 Travelling Salesman Problem(25 分)- 甲级

关键词:图、模拟

The “travelling salesman problem” asks the following question: “Given a list of cities and the distances between each pair of cities, what is the shortest possible route that visits each city and returns to the origin city?” It is an NP-hard problem in combinatorial optimization, important in operations research and theoretical computer science. (Quoted from “https://en.wikipedia.org/wiki/Travelling_salesman_problem”.)

In this problem, you are supposed to find, from a given list of cycles, the one that is the closest to the solution of a travelling salesman problem.

Input Specification:

Each input file contains one test case. For each case, the first line contains 2 positive integers N (2<N≤200), the number of cities, and M, the number of edges in an undirected graph. Then M lines follow, each describes an edge in the format City1 City2 Dist, where the cities are numbered from 1 to N and the distance Dist is positive and is no more than 100. The next line gives a positive integer K which is the number of paths, followed by K lines of paths, each in the format:
n C​1​​ C​2​​ ... C​n​​

where n is the number of cities in the list, and C​i​​’s are the cities on a path.

Output Specification:

For each path, print in a line Path X: TotalDist (Description) where X is the index (starting from 1) of that path, TotalDist its total distance (if this distance does not exist, output NA instead), and Description is one of the following:

  • TS simple cycle if it is a simple cycle that visits every city;
  • TS cycle if it is a cycle that visits every city, but not a simple cycle;
  • Not a TS cycle if it is NOT a cycle that visits every city.

Finally print in a line Shortest Dist(X) = TotalDist where X is the index of the cycle that is the closest to the solution of a travelling salesman problem, and TotalDist is its total distance. It is guaranteed that such a solution is unique.

Sample Input:

6 10
6 2 1
3 4 1
1 5 1
2 5 1
3 1 8
4 1 6
1 6 1
6 3 1
1 2 1
4 5 1
7
7 5 1 4 3 6 2 5
7 6 1 3 4 5 2 6
6 5 1 4 3 6 2
9 6 2 1 6 3 4 5 2 6
4 1 2 5 1
7 6 1 2 5 4 3 1
7 6 3 2 5 4 1 6

Sample Output:

Path 1: 11 (TS simple cycle)
Path 2: 13 (TS simple cycle)
Path 3: 10 (Not a TS cycle)
Path 4: 8 (TS cycle)
Path 5: 3 (Not a TS cycle)
Path 6: 13 (Not a TS cycle)
Path 7: NA (Not a TS cycle)
Shortest Dist(4) = 8

题目大意: 模拟:给出图并给出若干条路径,判断路径是这个图的旅行商环路、简单旅行商环路还是非旅行商环路。

简单回路:图的顶点序列中,除了第一个顶点和最后一个顶点相同外,其余顶点不重复出现的回路叫简单回路

代码:

#include <iostream>
#include <vector>
#include <set>
using namespace std;int e[210][210];
vector<int> route;
int n, m, k; //城市数量、无向图中边的数量、路线的数量
int ans = 0x3f3f3f, ansid;  //ansid最短的路线编号void check(int index) {int sum = 0, cnum, flag = 1;    //cnum路线中的城市数 flag是否满足旅行商环路scanf("%d", &cnum);  set<int> s;vector<int> v(cnum);for (int i = 0; i < cnum; i ++ ) {scanf("%d", &v[i]);s.insert(v[i]); //放入set中}for (int i = 0; i < cnum - 1; i ++ ) {if(e[v[i]][v[i + 1]] == 0) flag = 0;    //连续的两个点不可达,不满足旅行商环路sum += e[v[i]][v[i+1]];}if (flag == 0) {printf("Path %d: NA (Not a TS cycle)\n", index);    //不可达就没有总距离} else if(v[0] != v[cnum-1] || s.size() != n) {   //第一个结点和最后一个结点不同printf("Path %d: %d (Not a TS cycle)\n", index, sum);} else if(cnum != n + 1) {    //旅行商环路,但不满足访问源点两次printf("Path %d: %d (TS cycle)\n", index, sum);if (sum < ans) {ans = sum;ansid = index;}}else {  //简单旅行商环路,即满足访问过n+1个结点(源点访问两次)printf("Path %d: %d (TS simple cycle)\n", index, sum);if (sum < ans) {ans = sum;ansid = index;}}
}int main(){scanf("%d%d", &n, &m);for(int i = 0; i < m; i ++ ){int a, b, dist;scanf("%d%d%d", &a, &b, &dist);e[a][b] = e[b][a] = dist;}scanf("%d", &k);    //给定路径的数量for(int i  = 1; i <= k; i ++ ) check(i);printf("Shortest Dist(%d) = %d\n", ansid, ans);return 0;
}

PAT 1150 Travelling Salesman Problem相关推荐

  1. PAT 1150 Travelling Salesman Problem(25 分)- 甲级

    The "travelling salesman problem" asks the following question: "Given a list of citie ...

  2. PAT甲级1150 Travelling Salesman Problem:[C++题解]旅行商问题、图论

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 旅行商问题:访问每个城市并回到原城市的最短路. 思路: 1)判断相邻两点有无距离(NA):2)每个点是否都能到:3)是否是回路:4) ...

  3. 1150 Travelling Salesman Problem (25 分)【难度: 难 / 知识点: 图 模拟 未完成】

    https://pintia.cn/problem-sets/994805342720868352/problems/1038430013544464384

  4. cf1504. Travelling Salesman Problem

    cf1504. Travelling Salesman Problem 题意: n个城市,编号1~n,每个城市有美丽值a[i],现在要从城市1出发,其他所有城市走一遍,最后回到城市1,城市i到j的花费 ...

  5. 单目标应用:求解单仓库多旅行商问题(Single-Depot Multiple Travelling Salesman Problem, SD-MTSP)的人工兔优化算法ARO

    一.算法简介 人工兔优化算法(Artificial Rabbits Optimization ,ARO)由Liying Wang等人于2022年提出,该算法模拟了兔子的生存策略,包括绕道觅食和随机躲藏 ...

  6. 【HDU 5402】Travelling Salesman Problem(构造)

    被某题卡SB了,结果这题也没读好...以为每一个格子能够有负数就当搜索做了.怎么想也搜只是去,后来发现每一个格子是非负数,那么肯定就是构造题. 题解例如以下: 首先假设nn为奇数或者mm为奇数,那么显 ...

  7. Codeforces Round #712 (Div. 2) E. Travelling Salesman Problem 思维转换

    传送门 文章目录 题意: 思路: 题意: 给你nnn个点,从iii到jjj的花费是max(ci,aj−ai)max(c_i,a_j-a_i)max(ci​,aj​−ai​),求从111开始经过每个点再 ...

  8. 旅行商问题(Travelling salesman problem, TSP)

    旅行商问题建模与证明 – 个人学习记录

  9. 旅行商问题(travelling salesman problem, TSP) 解题报告

    旅行商问题是个熟知的问题.这次是因为coursera上面选的算法课而写代码实现.这里做个简单总结. 测试程序: 25 20833.3333 17100.0000 20900.0000 17066.66 ...

  10. JavaScript实现Travelling Salesman算法(附完整源码)

    JavaScript实现Travelling Salesman算法(附完整源码) bfTravellingSalesman.js完整源代码 bfTravellingSalesman.js完整源代码 f ...

最新文章

  1. php mysql zend linux_在Linux系统中安装Apache+MySQL+php+phpMyAdmin+Zend
  2. 对于初学者Python开发难学吗?适合初学者吗?
  3. 目前在线教育发展情况介绍
  4. Ftp实现上传文件至远程服务器
  5. SpringBoot与Spring的对比
  6. c语言如何用fscanf将字符串读取,在c语言中如何将文本内容 赋给一个 字符串
  7. WTL 自绘 进度条Progressbar
  8. SQL select查询原理--查询语句执行原则转
  9. [SpecialJudge]构造“神秘“字符串(洛谷P3742题题解,Java语言描述)
  10. 观、砺、破——我的算法之道
  11. select 设置不可用,提交表单时能传值
  12. 设置、取消word英文首字母大写
  13. 清除电脑bios密码
  14. 团队管理_第一期干部训练营心得
  15. Hybird A*算法
  16. 租的服务器怎么做系统,租了服务器怎么用
  17. 60种提升自身能量的方法
  18. 网管员必知:常用电脑密码破解
  19. [UE4]设置和获取GameInstance的方式:SetGameInstance,GetGameInstance
  20. mysql学生表_课程表_选课表,连表查询

热门文章

  1. 大学生该如何自学前端技术(HTML CSS JavaScript)?
  2. 抖音短视频运营技巧及实操:12条干货助你成功
  3. MEM/MBA 考研高频单词总结(08)
  4. Andriod --- 如何理解混淆配置?
  5. 6.18电商大促,如何利用邮件群发实现销量倍增
  6. eclipse中执行maven命令site报错:A required class was missing
  7. 《Effective C++ 》学习笔记(4th.确定对象被使用前已先被初始化)
  8. InfluxDB 安装与使用
  9. Solid Edge如何快速装配,如何截取组装关系式
  10. 如何配置 outlook 企业邮箱