给定一个N个顶点和M条边的无向图,K个查询,每个查询输入长度为n的路径,判断该路径是不是TS cycle或者TS simple cycle并输出题目要求的对应信息。算法
咱们使用邻接矩阵G保存该图的边权,而后使用path数组保存每一次查询的路径,判断该路径是不是TS cycle和TS simple cycle的方法以下:数组
isNa = true
,并统计起点出现的次数。printf("Path %d: NA (Not a TS cycle)n",i);
若是不是转4printf("Path %d: %d (Not a TS cycle)n",i,total_dist);
不然转5printf("Path %d: %d (Not a TS cycle)n",i,total_dist);
不然转6printf("Path %d: %d (TS simple cycle)n",i,total_dist);
不然是TS cycle,输出printf("Path %d: %d (TS cycle)n",i,total_dist);
同时在此状况下,得更新TS cycle或者TS simple cycle的最小路径长度和编号。#include<cstdio> #include<vector> #include<unordered_set> using namespace std; int N,M;// 顶点数目和边数 int G[205][205];// 邻接矩阵,存储边权,不存在为0 int main(){ scanf("%d %d",&N,&M); int a,b,dist; for (int i = 0; i < M; ++i) { scanf("%d %d %d", &a, &b, &dist); G[a][b] = G[b][a] = dist; } int K,num,city; scanf("%d",&K); int min_dis = 0x3fffffff; int min_dis_index = -1; for(int i=1;i<=K;++i){ scanf("%d",&num); vector<int> path; unordered_set<int> differentVertices;// 路径中不一样顶点的数目 for (int j = 0; j < num; ++j) { scanf("%d",&city); path.push_back(city); } // 得到路径长度和起点出现的次数 int total_dist = 0; int frequencyOfStart = 0; bool isNa = false; for (int k = 0; k < path.size(); ++k) { differentVertices.insert(path[k]); if(k<path.size()-1){ total_dist += G[path[k]][path[k+1]]; if(G[path[k]][path[k+1]]==0) { // 存在没法到达的边 isNa = true; } } if(path[k]==path[0]){ ++frequencyOfStart; } } if(isNa){ // 当前路径不连通,必定不是cycle printf("Path %d: NA (Not a TS cycle)\n",i); } else { // 必定连通 if(path[0]!=path[path.size()-1]){ // 起点和终点不同,不是cycle printf("Path %d: %d (Not a TS cycle)\n",i,total_dist); } else { // 必定是cycle,起点至少出现了2次 if(differentVertices.size()!=N){ // 没有访问每个城市,不是TS cycle或者TS simple cycle printf("Path %d: %d (Not a TS cycle)\n",i,total_dist); } else { // 必定是TS cycle或者TS simple cycle if(min_dis>total_dist){ // 更新最短距离和编号 min_dis_index = i; min_dis = total_dist; } if(frequencyOfStart==2){ // 顶点只出现了2次且访问了每个城市,是TS simple cycle printf("Path %d: %d (TS simple cycle)\n",i,total_dist); } else{ // 顶点出现大于2次且访问了每个城市,是TS cycle printf("Path %d: %d (TS cycle)\n",i,total_dist); } } } } } printf("Shortest Dist(%d) = %d",min_dis_index,min_dis); return 0; }