#include<iostream>
#include<set>
#include<algorithm>
#include<vector>
using namespace std;
int e[210][210];
const int inf=100000000;
int main(){
int N,M,K,n,w,a,b;
cin>>N>>M;
fill(e[0],e[0]+210*210,inf);
for(int i=0;i<M;i++){
cin>>a>>b>>w;
e[a][b]=e[b][a]=w;
}
cin>>K;
int ansID=0,ansTotal=inf;
for(int i=0;i<K;i++){
printf("Path %d: ",i+1);
int total=0,flag=1;
cin>>n;
vector<int> v(n);
set<int> s;
for(int j=0;j<n;j++){
cin>>v[j];
s.insert(v[j]);
}
for(int j=0;j<n-1;j++){
if(e[v[j]][v[j+1]]==inf){
printf("NA (Not a TS cycle)\n");
flag=0;
break;
}
total+= e[v[j]][v[j+1]];
}
if(flag){
printf("%d ",total);
if(v[0]!=v[n-1]||s.size()!=N) printf("(Not a TS cycle)\n");//不是圆或者少访问了点
else if(n!=N+1){//点访问多了
printf("(TS cycle)\n");
if(total<ansTotal){
ansID=i+1;
ansTotal=total;
}
}else{
printf("(TS simple cycle)\n");
if(total<ansTotal){
ansID=i+1;
ansTotal=total;
}
}
}
}
printf("Shortest Dist(%d) = %d\n",ansID,ansTotal);
return 0;
}
1150 Travelling Salesman Problem
最新推荐文章于 2022-11-28 16:20:22 发布