1150 Travelling Salesman Problem

#include<iostream>

#include<set>

#include<vector>

using namespace std;

//定义全局变量

int n,m,k,e[300][300];

int ansid;//最短路径的查询编号

int ans=999999999;//最短路径初始化

void check(int index){

int sum=0;//路径总长度

int cnt;//当前路径包含的顶点数

int flag=1;//判断当前路径是否联通

cin>>cnt;

set<int>s;//用于记录路径中访问的不同顶点

vector<int>v(cnt);//存储路径中顶点的序列

//将顶点存入序列中

for(int i=0;i<cnt;i++){

cin>>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]];

}

//情况1:如果路径不连通

if(flag==0){

cout<<"Path "<<index<<": NA (Not a TS cycle)"<<endl;

}

//情况2:不是环或未访问所有顶点

else if(v[0]!=v[cnt-1]||s.size()!=n){

cout<<"Path "<<index<<": "<<sum<<" (Not a TS cycle)"<<endl;

}

//情况3:TS是环,但不是简单环

else if(cnt!=n+1){

cout << "Path " << index << ": " << sum << " (TS cycle)" << endl;

if(sum<ans){

ans=sum;

ansid=index;

}

}

//情况4:TS简单环

else{

cout << "Path " << index << ": " << sum << " (TS simple cycle)" << endl;

if(sum<ans){

ans=sum;

ansid=index;

}

}

}

int main(){

cin>>n>>m;

for(int i=0;i<m;i++){

int t1,t2,t;

cin>>t1>>t2>>t;

e[t1][t2]=e[t2][t1]=t;

}

cin>>k;

//逐条检查每条路径

for(int i=1;i<=k;i++){

check(i);

}

cout << "Shortest Dist(" << ansid << ") = " << ans << endl;

return 0;

}

相关推荐
松☆7 小时前
CANN与大模型推理:在边缘端高效运行7B参数语言模型的实践指南
人工智能·算法·语言模型
_F_y7 小时前
C++重点知识总结
java·jvm·c++
java干货7 小时前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
皮皮哎哟7 小时前
数据结构:嵌入式常用排序与查找算法精讲
数据结构·算法·排序算法·二分查找·快速排序
程序员清洒7 小时前
CANN模型剪枝:从敏感度感知到硬件稀疏加速的全链路压缩实战
算法·机器学习·剪枝
vortex58 小时前
几种 dump hash 方式对比分析
算法·哈希算法
堕2748 小时前
java数据结构当中的《排序》(一 )
java·数据结构·排序算法
初願致夕霞8 小时前
Linux_进程
linux·c++
2302_813806228 小时前
【嵌入式修炼:数据结构篇】——数据结构总结
数据结构
Thera7779 小时前
【Linux C++】彻底解决僵尸进程:waitpid(WNOHANG) 与 SA_NOCLDWAIT
linux·服务器·c++