A1150 Travelling Salesman Problem (25分)
一、技术总结
- 这一题是考查旅行商问题,但不是传统意义上的遍历图,然后找最短路径之类的;
- 首先应该明确有四类,一类是不能够走通的,也就是在所给路径中,有相邻的两点存在不通的情况;
- 再就是所给路径走得通,但是不是旅行商问题,也就是第一个城市与最后一个城市不是同一个或者没有走完所有的城市;
- 然后就是旅行商问题,但是不是最简旅行商问题,即走过所有城市,并且开始和最后是同一个城市,但是有些城市走过不止一遍;
- 最后就是最简旅行商问题了,每个城市走一遍,然后开始和结尾是同一个城市;
- 题目要求,我们最后一行输出时旅行商路径的中输出距离最短的,也就是在4和5中考虑。
- 最后按要求输出即可
二、参考代码
#include<iostream>
#include<set>
#include<vector>
using namespace std;
int e[300][300], n, m, k, ans = 9999999, ansid;
vector<int> v;
void check(int index){
int sum = 0, cnt, flag = 1;
scanf("%d", &cnt);
set<int> s;
vector<int> v(cnt);
for(int i = 0; i < cnt; i++){
scanf("%d", &v[i]);
s.insert(v[i]);
}
for(int i = 0; i < cnt - 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[cnt - 1] || s.size() != n){
printf("Path %d: %d (Not a TS cycle)\n", index, sum);
}else if(cnt != n + 1){
printf("Path %d: %d (TS cycle)\n", index, sum);
if(sum < ans){
ans = sum;
ansid = index;
}
}else{
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 t1, t2, t;
scanf("%d%d%d", &t1, &t2, &t);
e[t1][t2] = e[t2][t1] = t;
}
scanf("%d", &k);
for(int i = 1; i <= k; i++){
check(i);
}
printf("Shortest Dist(%d) = %d\n", ansid, ans);
return 0;
}
作者:睿晞
身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
曾有一个业界大牛说过这样一段话,送给大家:
“华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.