旅行商问题,首先判断是否为环路,之后判断是否为简单环路,最后输出最短距离
坑点如下;
1,判断所给图中连续的连点之间是否连通
2,用set和vector结合的方式来判断是为简单回路
整体代码如下
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3fffffff;
int n,m,k,num,b,w,sdis,snum;
int G[210][210];
set<int>s;
vector<int>temp,v[210];
int iscy=1,issim=1;
int vis[210];
int main(){
int v1,v2;
sdis=INF;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d",&v1,&v2);
scanf("%d",&G[v1][v2]);
G[v2][v1]=G[v1][v2];
v[v2].push_back(v1);
v[v1].push_back(v2);
}
scanf("%d",&k);
for(int i=1;i<=k;i++){
int cnt=0;
iscy=1;
w=0;
memset(vis,0,sizeof(vis));
temp.clear();
s.clear();
scanf("%d",&num);
for(int l=0;l<num;l++)
{
scanf("%d",&b);
temp.push_back(b);
s.insert(b);
}
for(int c=0;c<temp.size()-1;c++)
{ w+=G[temp[c]][temp[c+1]];
if(G[temp[c]][temp[c+1]]==0)
iscy=0;
}
if(s.size()==n&&temp.size()==n+1&&temp[0]==temp[num-1]&&iscy==1){
printf("Path %d: %d (TS simple cycle)\n",i,w);
if(w<sdis){sdis=w;
snum=i;}
continue;
}
if(iscy==0){
printf("Path %d: NA (Not a TS cycle)\n",i);
continue;}
if(s.size()==n&&temp[0]==temp[num-1])
{ printf("Path %d: %d (TS cycle)\n",i,w);
if(w<sdis){sdis=w;
snum=i;}
continue;}
else
{
printf("Path %d: %d (Not a TS cycle)\n",i,w);
}
}
printf("Shortest Dist(%d) = %d",snum,sdis);
}