#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int SIZE = 400;
struct Node {
int data;
int dis;
Node(int data, int dis) : data(data), dis(dis) {}
} ;
vector<Node> adj[SIZE];
vector<int> path(SIZE);
vector<pair<int,int>> shortPath;
int main() {
int N, M, c1, c2, dis, K, n;
cin >> N >> M;
for (int i = 0; i < M; i ++) {
cin >> c1 >> c2 >> dis;
Node node1(c1, dis);
Node node2(c2, dis);
adj[c1].push_back(node2);
adj[c2].push_back(node1);
}
cin >> K;
int visit[SIZE];
for (int i = 1; i <= K; i ++) {
fill(visit, visit + SIZE, 0);
cin >> n;
for (int i = 0; i < n; i ++) {
cin >> path[i];
}
bool flagIsCircle = true, flagIsSimple = true, flagIsTs = true; //存在圈
int allDis = 0;
for (int j = 0; j < n - 1; j ++) {
int start = path[j];
int target = path[j + 1];
visit[start] ++;
bool tflag = false; //false表示start不能到达target
for (int k = 0; k < adj[start].size(); k ++) {
if (adj[start][k].data == target) {
allDis += adj[start][k].dis;
tflag = true;
break;
}
}
if (!tflag) { //构不成环
allDis = -1;
flagIsCircle = false;
flagIsSimple = false;
break;
}
}
if (!flagIsCircle) { //不是环
printf("Path %d: NA (Not a TS cycle)\n", i);
continue;
}
//是环但是没有拜访所有城市或者没有回到原点
if (path[0] != path[n - 1]) flagIsTs = false;
for (int j = 1; j <= N; j ++) {
if (visit[j] != 1) flagIsSimple = false; //一旦有的城市没有拜访一次,就不是最简单的环
if (visit[j] == 0) {
flagIsTs = false;
break;
}
}
if (!flagIsTs) {
printf("Path %d: %d (Not a TS cycle)\n", i, allDis);
continue;
}
pair<int, int> p(allDis, i);
shortPath.push_back(p);
if (flagIsSimple) {
printf("Path %d: %d (TS simple cycle)\n", i, allDis);
continue;
} else {
printf("Path %d: %d (TS cycle)\n", i, allDis);
}
}
sort(shortPath.begin(), shortPath.end());
printf("Shortest Dist(%d) = %d\n", shortPath[0].second, shortPath[0].first);
cin >> K;
return 0;
}
1150 Travelling Salesman Problem (25分)
最新推荐文章于 2024-06-15 16:17:24 发布