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

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 <bits/stdc++.h>
using namespace std; #define inf 0x3f3f3f3f
int N, M, K;
int dis[220][220];
int vis[220], go[220]; int main() {
scanf("%d%d", &N, &M);
memset(dis, inf, sizeof(dis));
while(M --) {
int st, en, cost;
scanf("%d%d%d", &st, &en, &cost);
if(cost < dis[st][en]) {
dis[st][en] = cost;
dis[en][st] = dis[st][en];
}
} scanf("%d", &K);
int temp = 0, ans = INT_MAX;
for(int k = 1; k <= K; k ++) {
int T;
bool can = false;
int cnt1 = 0, cnt2 = 0;
memset(vis, 0, sizeof(vis));
bool flag = true;
int sum = 0;
scanf("%d", &T);
for(int i = 1; i <= T; i ++) {
scanf("%d", &go[i]);
vis[go[i]] ++;
if(i > 1) {
if(dis[go[i]][go[i - 1]] != inf) {
sum += dis[go[i]][go[i - 1]];
}
else flag = false;
}
} printf("Path %d: ", k);
if(!flag)
printf("NA (Not a TS cycle)\n");
else {
int iscycle = 0;
for(int i = 1; i <= N; i ++) {
if(vis[i] == 0)
iscycle = 1;
if(vis[i] == 1) cnt1 ++;
if(vis[i] > 1) cnt2 ++;
} if(iscycle == 1) printf("%d (Not a TS cycle)\n", sum);
else if(cnt2 == 1 && vis[go[1]] == 2) {
can = true;
printf("%d (TS simple cycle)\n", sum);
}
else if(cnt2 >= 1 && vis[go[1]] >= 2) {
can = true;
printf("%d (TS cycle)\n", sum);
}
else if(cnt2 >= 1 && vis[go[1]] < 2)
printf("%d (Not a TS cycle)\n", sum);
else printf("%d (Not a TS cycle)\n", sum); if(can && sum < ans) {
ans = sum;
temp = k;
} } } printf("Shortest Dist(%d) = %d\n", temp, ans);
return 0;
}

  被图论支配的上午 暴躁 Be 主 在线编程

一会有牛客的比赛 哭咧咧

PAT 甲级 1150 Travelling Salesman Problem的更多相关文章

  1. 1150 Travelling Salesman Problem(25 分)

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

  2. 1150 Travelling Salesman Problem

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

  3. PAT A1150 Travelling Salesman Problem (25 分)——图的遍历

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

  4. PAT_A1150#Travelling Salesman Problem

    Source: PAT A1150 Travelling Salesman Problem (25 分) Description: The "travelling salesman prob ...

  5. 构造 - HDU 5402 Travelling Salesman Problem

    Travelling Salesman Problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5402 Mean: 现有一 ...

  6. HDU 5402 Travelling Salesman Problem (构造)(好题)

    大致题意:n*m的非负数矩阵,从(1,1) 仅仅能向四面走,一直走到(n,m)为终点.路径的权就是数的和.输出一条权值最大的路径方案 思路:因为这是非负数,要是有负数就是神题了,要是n,m中有一个是奇 ...

  7. HDOJ 5402 Travelling Salesman Problem 模拟

    行数或列数为奇数就能够所有走完. 行数和列数都是偶数,能够选择空出一个(x+y)为奇数的点. 假设要空出一个(x+y)为偶数的点,则必须空出其它(x+y)为奇数的点 Travelling Salesm ...

  8. HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)

    Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (J ...

  9. PAT-1150(Travelling Salesman Problem)旅行商问题简化+模拟图+简单回路判断

    Travelling Salesman Problem PAT-1150 #include<iostream> #include<cstring> #include<st ...

随机推荐

  1. WPF 自定义ComboBox样式,自定义多选控件

    原文:WPF 自定义ComboBox样式,自定义多选控件 一.ComboBox基本样式 ComboBox有两种状态,可编辑和不可编辑状态.通过设置IsEditable属性可以切换控件状态. 先看基本样 ...

  2. Java集合——TreeMap源码详解

    )TreeMap 是一个有序的key-value集合,它是通过红黑树实现的.因为红黑树是平衡的二叉搜索树,所以其put(包含update操作).get.remove的时间复杂度都为log(n). (2 ...

  3. UOJ UR#9 App管理器

    题目传送门 题目大意大概就是给你一个混合图(既有有向边又有无向边),对于每条无向边,u-v,问删去u->v,或删去v->u那条可以使新图强连通.(保证数据有解). 这道题前几个数据点送分. ...

  4. Linux下开发python django程序(Session读写)

    1.登陆设置session信息 def loginsession(req): if req.method == 'POST': loginform = LoginForm(req.POST) if l ...

  5. java 或者 js 获取项目访问路径(域名)

    /** * 获得站点url * @return */ public String getWebUrl(){ String url = getRequest().getScheme() + " ...

  6. Object C学习笔记5-ARC forbids explicit message* 编译错误

    在学习Object C的过程中XCode 编译器经常出现 "ARC forbids explicit message send of release" 的错误提示. 以上问题主要出 ...

  7. Unity3d — — UGUI之Box Collider自适应大小

    NGUI下给Sprite/image添加collider后能自适应大小,但是在UGUI下Collider是默认在(0,0)位置,size为0 因此写了个简单的脚本,效果如下(最后附代码) 1.如下图添 ...

  8. 使用proxyee-down解决百度云下载限速问题

    1.在下面页面安装HTTP下载器 https://github.com/proxyee-down-org/proxyee-down#%E4%B8%8B%E8%BD%BD 2.安装switchy插件 h ...

  9. python 思维导图-linux命令

    linux基础 linux关于文件/目录的终端命令 linux关于文件内容处理的终端命令

  10. DICOM 协议学习笔记之 What is DICOM

    什么是DICOM? Dicom (Digital Imaging and Communications in Medicine)即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052 ...