1150 Travelling Salesman Problem

实际上挺水。。。

 1 #include <iostream>
 2 #include <stdlib.h>
 3 #include <string>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<cmath>
 7 #include<map>
 8 #include<set>
 9 #include <unordered_map>
10 using namespace std;
11
12 int main(){
13     int v, e;
14     cin >> v >> e;
15     int m1[201][201];
16     fill(m1[0], m1[0]+ 201 * 201, 0);
17
18     for (int i = 0; i < e; i++) {
19         int v1, v2, d;
20         cin >> v1 >> v2 >> d;
21         m1[v1][v2] = d;
22         m1[v2][v1] = d;
23     }
24     int num;
25     cin >> num;
26     int index = -1;
27     int shortest = 9999999;
28
29     for (int i = 0; i < num; i++) {
30         int k;
31         cin >> k;
32         vector<int> route;
33         for (int j = 0; j < k; j++) {
34             int node;
35             cin >> node;
36             route.push_back(node);
37         }
38         int total = 0;
39         int vis[201];
40         fill(vis, vis + 201, 0);
41         bool f1=1, f2=1,f3=1;
42         for (int j = 0; j < k-1; j++) {
43             if (m1[route[j]][route[j + 1]] == 0) {
44                 f1 = 0;
45             }
46             else {
47                 total += m1[route[j]][route[j + 1]];
48                 vis[route[j + 1]]++;
49             }
50         }
51
52         for (int a = 1; a <= v; a++) {
53             if (vis[a] == 0) {
54                 f2 = 0;
55             }
56             else if (vis[a] > 1) {
57                 f3 = 0;
58             }
59         }
60
61         printf("Path %d: ", i + 1);
62
63         if (f1 != 0 && f2!=0) {
64             if (shortest > total) {
65                 shortest = total;
66                 index = i + 1;
67             }
68         }
69         if (f1 == 0) {
70             printf("NA ");
71         }
72         else {
73             printf("%d ", total);
74         }
75
76         if (f2 == 0) {
77             printf("(Not a TS cycle)\n");
78         }
79         else if (f3 == 0) {
80             printf("(TS cycle)\n");
81         }
82         else {
83             printf("(TS simple cycle)\n");
84         }
85
86     }
87     printf("Shortest Dist(%d) = %d\n", index, shortest);
88     system("pause");
89 };

原文地址:https://www.cnblogs.com/wsggb123/p/10226316.html

时间: 2024-11-09 02:23:17

1150 Travelling Salesman Problem的相关文章

1150 Travelling Salesman Problem (25 分)

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 retu

PAT 甲级 1150 Travelling Salesman Problem

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 possib

构造 - HDU 5402 Travelling Salesman Problem

Travelling Salesman Problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5402 Mean: 现有一个n*m的迷宫,每一个格子都有一个非负整数,从迷宫的左上角(1,1)到迷宫的右下角(n,m),并且使得他走过的路径的整数之和最大,问最大和为多少以及他走的路径. analyse: 首先,因为每个格子都是非负整数,而且规定每个格子只能走一次,所以为了使和尽可能大,必定是走的格子数越多越好.这样我们就需

hdu5402 Travelling Salesman Problem(棋盘染色+模拟)

题目: Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 906    Accepted Submission(s): 331 Special Judge Problem Description Teacher Mai is in a maze with n rows and m c

HDOJ 5402 Travelling Salesman Problem 模拟

行数或列数为奇数就能够所有走完. 行数和列数都是偶数,能够选择空出一个(x+y)为奇数的点. 假设要空出一个(x+y)为偶数的点,则必须空出其它(x+y)为奇数的点 Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 747    Accepted Submission(s): 272

多校9 1007 Travelling Salesman Problem

Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 829    Accepted Submission(s): 182Special Judge Problem Description Teacher Mai is in a maze with n rows and m columns

【HDOJ 5402】Travelling Salesman Problem

[HDOJ 5402]Travelling Salesman Problem 一开始以为是搜索 仔细画了画发现就一模拟 奇数行或奇数列的时候怎么走都能全走完 偶数行偶数列的时候就要挑了 . * . * . * * . * . * . . * . * . * * . * . * . 以4*6为例(如上图 星号可以保证不取其中一个可遍历完全图 点好的话就会连带一些星号 所以绕过星号中的最小值 是最佳遍历方式 输入的时候找到最小值并记录下行列 遍历到改行前以 右走到头 下 左走到头 下 右走到头这种方

HDU 5402 Travelling Salesman Problem (模拟 有规律)

Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 568    Accepted Submission(s): 200 Special Judge Problem Description Teacher Mai is in a maze with n rows and m colum

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

大致题意:n*m的非负数矩阵,从(1,1) 只能向四面走,一直走到(n,m)为终点,路径的权就是数的和,输出一条权值最大的路径方案 思路:由于这是非负数,要是有负数就是神题了,要是n,m中有一个是奇数,显然可以遍历,要是有一个偶数,可以画图发现,把图染成二分图后,(1,1)为黑色,总能有一种构造方式可以只绕过任何一个白色的点,然后再遍历其他点,而绕过黑色的点必然还要绕过两个白色点才能遍历全部点,这是画图发现的,所以找一个权值最小的白色点绕过就可以了, 题解给出了证明: 如果n,mn,m都为偶数,