1150 Travelling Salesman Problem (25分)
題目要求
旅行商問題
給定路徑
判斷是否爲旅行商路徑、旅行商簡單路徑、非旅行商路徑
最後輸出最短旅行商路徑
解題思想
isConnect判斷是否存在路徑
isTS判斷是否爲旅行商路徑
isSimple判斷是否爲簡單旅行商路徑
AC代碼
#include <iostream>
#include <cstdio>
#include <cstring>
#define inf 0x3f3f3f3f
using namespace std;
int n, m;
int dis[220][220];
int main(){
scanf("%d%d", &n, &m);
int a, b, d, k, v, pre, cur, head, minp = inf, mind = inf;
for (int i = 0; i < m; i++){
scanf("%d%d%d", &a, &b, &d);
dis[a][b] = dis[b][a] = d;
}
scanf("%d", &k);
for (int p = 1; p <= k; p++){
int have[220], isConnect = 1, tot = 0, isTS = 1;
memset(have, 0, sizeof(have));
scanf("%d%d", &v, &head);
have[head] += 1;
pre = head;
for (int i = 1; i < v; i++){
scanf("%d", &cur);
if (i == v-1 && cur != head) isTS = 0;
if (dis[pre][cur]){
tot += dis[pre][cur];
have[cur] += 1;
pre = cur;
}
else isConnect = 0;
}
if (isConnect){
int isSimple = 1;
for (int i = 1; i <= n; i++){
if (!have[i]) isTS = 0;
if ((i != head && have[i] > 1) || (i == head && have[i] > 2)) isSimple = 0;
}
if (isTS){
if (tot < mind){
mind = tot;
minp = p;
}
if (isSimple) printf("Path %d: %d (TS simple cycle)\n", p, tot);
else printf("Path %d: %d (TS cycle)\n", p, tot);
}
else printf("Path %d: %d (Not a TS cycle)\n", p, tot);
}
else printf("Path %d: NA (Not a TS cycle)\n", p);
}
printf("Shortest Dist(%d) = %d", minp, mind);
return 0;
}