A1150 Travelling Salesman Problem (25分)

一、技术总结

  1. 这一题是考查旅行商问题,但不是传统意义上的遍历图,然后找最短路径之类的;
  2. 首先应该明确有四类,一类是不能够走通的,也就是在所给路径中,有相邻的两点存在不通的情况;
  3. 再就是所给路径走得通,但是不是旅行商问题,也就是第一个城市与最后一个城市不是同一个或者没有走完所有的城市;
  4. 然后就是旅行商问题,但是不是最简旅行商问题,即走过所有城市,并且开始和最后是同一个城市,但是有些城市走过不止一遍;
  5. 最后就是最简旅行商问题了,每个城市走一遍,然后开始和结尾是同一个城市;
  6. 题目要求,我们最后一行输出时旅行商路径的中输出距离最短的,也就是在45中考虑。
  7. 最后按要求输出即可

二、参考代码

#include
#include
#include
using namespace std;
int e[300][300], n, m, k, ans = 9999999, ansid;
vector v;
void check(int index){
	int sum = 0, cnt, flag = 1;
	scanf("%d", &cnt);
	set s;
	vector 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;
}

你可能感兴趣的:(A1150 Travelling Salesman Problem (25分))