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;

}

相关推荐
大闲在人15 小时前
使用有向莱顿算法进行供应链/物料流转网络的集群划分
网络·算法
im_AMBER15 小时前
Leetcode 110 奇偶链表
数据结构·学习·算法·leetcode
踩坑记录17 小时前
leetcode hot100 easy 101. 对称二叉树 递归 层序遍历 bfs
算法·leetcode·宽度优先
2501_9403152618 小时前
leetcode182动态口令(将字符的前几个元素放在字符串后面)
算法
安全二次方security²18 小时前
CUDA C++编程指南(7.25)——C++语言扩展之DPX
c++·人工智能·nvidia·cuda·dpx·cuda c++编程指南
老鼠只爱大米18 小时前
LeetCode经典算法面试题 #98:验证二叉搜索树(递归法、迭代法等五种实现方案详解)
算法·leetcode·二叉树·递归·二叉搜索树·迭代
爱装代码的小瓶子18 小时前
【c++与Linux基础】文件篇(4)虚拟文件系统VFS
linux·开发语言·c++
疯狂的喵1 天前
C++编译期多态实现
开发语言·c++·算法
scx201310041 天前
20260129LCA总结
算法·深度优先·图论
2301_765703141 天前
C++中的协程编程
开发语言·c++·算法