1150 Travelling Salesman Problem

旧巷老猫 提交于 2020-02-06 00:44:08

题目

题意:给出一张图,k条路径,判断这些路径是这个图的旅行商环路、简单旅行商环路还是非旅行商环路

#include<iostream>
#include<set>
#include<cstring>
using namespace std;
int s[203][203];
int query[203];
int n,m;
int minlen=1e7,minindex=1e7;
void checked(int c) {
	int t,flag=0;
	cin>>t;
	set<int> num;
	for(int j=0; j<t; ++j) {
		cin>>query[j];
		num.insert(query[j]);
	}
	int sum=0;
	for(int i=0; i<t-1; ++i) {
		sum+=s[query[i]][query[i+1]];
		if(!s[query[i]][query[i+1]]) {
			flag=1;
			break;
		}
	}
	if(flag==1)//query中存在两点之间不可达的情况 
		printf("Path %d: NA (Not a TS cycle)\n",c);
	else if(query[0]!=query[t-1]||num.size()!=n)//query并没有走完所有城市或者开始和结尾城市不一样 
		printf("Path %d: %d (Not a TS cycle)\n",c,sum);
	else {
		if(minlen>sum) {
			minindex=c;
			minlen=sum;
		}
		if(t!=n+1)//query存在走重复的城市 
			printf("Path %d: %d (TS cycle)\n",c,sum);
		else printf("Path %d: %d (TS simple cycle)\n",c,sum);
	}
}
int main() {
	cin>>n>>m;
	memset(s,0,sizeof(s));
	for(int i=0; i<m; ++i) {
		int a,b,c;
		cin>>a>>b>>c;
		s[a][b]=c;
		s[b][a]=c;
	}
	int k;
	cin>>k;
	for(int i=0; i<k; ++i)
		checked(i+1);
	printf("Shortest Dist(%d) = %d\n",minindex,minlen);
	return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!